कई बाधाओं के साथ सामान्य विधि


251

मेरे पास एक सामान्य विधि है जिसमें दो सामान्य पैरामीटर हैं। मैंने नीचे दिए गए कोड को संकलित करने की कोशिश की लेकिन यह काम नहीं करता है। क्या यह एक .NET सीमा है? क्या विभिन्न मापदंडों के लिए कई अवरोध होना संभव है?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass

जवाबों:


402

ऐसा करना संभव है, आपको सिंटैक्स थोड़ा गलत मिला है। आपको whereअल्पविराम से अलग करने के बजाय प्रत्येक बाधा की आवश्यकता है :

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass

8

एक अन्य उपयोग के साथ @LukeH द्वारा मुख्य उत्तर के अलावा, हम कक्षा के बजाय कई इंटरफेस का उपयोग कर सकते हैं। (एक वर्ग और n गिनती इंटरफेस) इस तरह

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass

या

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass

1

@ ल्यूक द्वारा मुख्य उत्तर के अलावा, मेरे पास निर्भरता इंजेक्शन के साथ समस्या है, और मुझे इसे ठीक करने में कुछ समय लगा। यह साझा करने के लिए लायक है, जो एक ही मुद्दे का सामना करते हैं:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

इसे इस तरह से हल किया जाता है। कंटेनरों / सेवाओं में कुंजी टाइपोफ़ और अल्पविराम (,) है

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

इस उत्तर में इसका उल्लेख किया गया था ।


2
यह उत्तर टाइप बाधाओं से संबंधित नहीं है। यह अनबाउंड जेनेरिक प्रकारों के बारे में है और सी # में उन्हें कैसे निकालना है। stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
पेलेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.