2009-07-09 15 views
5

मैं कुछ इस तरह हासिल करना चाहते हैं में सी # 3.5:सी # 3.5 में एक सामान्य विधि पर इंटरफ़ेस बाधा डालने के लिए कैसे?

public void Register<T>() : where T : interface {} 

मैं वर्ग या struct के साथ यह कर सकते हैं, लेकिन कैसे एक इंटरफेस के साथ यह करने के लिए?

+1

की डुप्लीकेट http://stackoverflow.com/questions/1096568/how-can-i-use-interface- एएस-एसी-जेनेरिक-टाइप-बाधा –

उत्तर

4

सी # और सीएलआर समग्र इंटरफ़ेस बाधाओं का समर्थन नहीं करता है, हालांकि आप इसे किसी विशेष इंटरफ़ेस में बाध्य कर सकते हैं (अन्य उत्तरों देखें)। सबसे नज़दीक आप प्राप्त कर सकते हैं 'कक्षा' है और रनटाइम पर प्रतिबिंब का उपयोग कर प्रकार की जांच करें मुझे डर है। आप पहली जगह इंटरफ़ेस बाधा क्यों चाहते हैं?

+0

कस्टम/पागल लागू निर्भरता इंजेक्शन के लिए, शायद। लेकिन यह मुझे अनुमान है। – Felype

6

आप एक विशिष्ट इंटरफ़ेस के लिए एक बाधा को जोड़ने के बारे में पूछ रहे हैं, तो यह है कि सीधा है:

public void Register<T>(T data) where T : ISomeInterface 

आप पूछ रहे हैं, तो एक कीवर्ड टी के लिए संभव प्रकार की सीमा सीमित करना वर्ग या struct की तरह मौजूद है या नहीं, कि उपलब्ध नहीं है।

आप लिखते हैं:

public void Register<T>(T data) where T : class // (or struct) 

आप नहीं लिख सकते हैं:

public void Register<T>(T data) where T : interface 
0

आपको लगता है कि टी मांग नहीं कर सकते हैं एक अंतरफलक है, तो आप प्रतिबिंब का उपयोग करना होगा रनटाइम पर यह जोर देने के लिए।

0

यदि संभव हो, तो मैं इस तरह के समाधान के साथ गया। यह केवल तभी काम करता है जब आप एक सामान्य पैरामीटर के रूप में पारित होने के लिए कई विशिष्ट इंटरफेस (उदा। जिनके पास स्रोत पहुंच है) चाहते हैं, कोई भी नहीं।

  • मैंने अपने इंटरफेस को प्रश्न में आने दिया, एक खाली इंटरफेस IInterface का वारिस किया।
  • मैं सामान्य टी पैरामीटर विवश IInterface

स्रोत में हो सकता है, यह इस तरह दिखता है:

  • आप सामान्य पैरामीटर के रूप में पारित किया जा करना चाहते हैं किसी भी इंटरफ़ेस:

    public interface IWhatever : IInterface 
    { 
        // IWhatever specific declarations 
    } 
    
  • IInterface:

    public interface IInterface 
    { 
        // Nothing in here, keep moving 
    } 
    
  • वर्ग है जिस पर आप प्रकार बाधा डालना चाहते:

    public class WorldPieceGenerator<T> where T : IInterface 
    { 
        // Actual world piece generating code 
    } 
    
संबंधित मुद्दे