2013-08-14 6 views
20

मैं एक अंतरफलकचेक एक प्रकार सामान्य प्रकार तर्क पर विचार किए बिना एक सामान्य इंटरफ़ेस लागू करता है, तो

public interface MyInterface<TKey, TValue> 
{ 
} 

क्रियान्वयन अप्रासंगिक हैं। अब मैं यह जांचना चाहता हूं कि दिया गया प्रकार उस इंटरफ़ेस का कार्यान्वयन है या नहीं। इस विधि

public class MyClass : MyInterface<int, string> 
{ 
} 

के लिए विफल रहता है लेकिन मैं जाँच कैसे करना है पता नहीं है।

public void CheckIfTypeImplementsInterface(Type type) 
{ 
    var result1 = typeof(MyInterface<,>).IsAssignableFrom(type); --> false 
    var result2 = typeof(MyInterface<int,string>).IsAssignableFrom(type); --> true 
} 

परिणाम 1 के लिए मुझे क्या करना है?

+0

क्या आपने 'माईइंटरफेस' इंटरफ़ेस बनाने पर विचार किया है और 'MyInterface : MyInterface' है? –

उत्तर

33

जहां तक ​​मुझे पता है, ऐसा करने का एकमात्र तरीका सभी इंटरफेस प्राप्त करना है और देखें कि जेनेरिक परिभाषा आवश्यक इंटरफ़ेस प्रकार से मेल खाती है या नहीं।

bool result1 = type.GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Select(i => i.GetGenericTypeDefinition()) 
    .Contains(typeof(MyInterface<,>)); 

संपादित करें: जॉन टिप्पणी में बताते हैं के रूप में, आप भी कर सकता है:

bool result1 = type.GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Any(i => i.GetGenericTypeDefinition() == typeof(MyInterface<,>)); 
+4

आप अपने अंतिम दो को बदल सकते हैं: 'एनी (i => i.GetGenericTypeDefinition() == टाइपऑफ (MyInterface <,>)) –

2

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

interface ICountable 
    { CollectionAttribute Attributes {get;} int Count {get;} } 
interface ICollection<T> : IEnumerable<T> ICountable 
    { ... and other stuff ... } 

ऐसी बात ICollection के साथ किया गया होता, तो कोड है जो एक IEnumerable<Animal> उम्मीद कर रहा था लेकिन प्रकार CatList का एक उद्देश्य मिल गया यह केवल IList<Cat> लागू करता है उस ऑब्जेक्ट के Count सदस्य का उपयोग करने में कोई समस्या नहीं होगी (ध्यान दें कि List<Animal> गैर-जेनेरिक ICollection लागू करता है, लेकिन अन्य IList<Animal> कार्यान्वयन नहीं हो सकता है)।

यह है के रूप में, यदि आप किसी भी तरह ICollection<Cat> की Count विधि को खोजने के लिए जब आप एक IEnumerable<Animal> उम्मीद कर रहे हैं कोड होने के कार्य के साथ फंस रहे हैं, यह सार्थक एक Dictionary<Type, Func<IEnumerable<Animal>, int> इसलिए की तरह कुछ का निर्माण करने में हो सकता है कि एक बार आप है पाया गया कि CatList लागू ICollection<Cat>.Count आप एक विधि को एक प्रतिनिधि बना सकते हैं जो ICollection<Cat> पर अपना तर्क डालेगा, उस पर Count पर कॉल करें, और इसके परिणाम को वापस करें। यदि आपके पास ऐसा शब्दकोश है, तो यदि आपको CatList दिया गया है तो आप बस शब्दकोश से प्रतिनिधि को आमंत्रित कर पाएंगे।

+0

पूरी तरह से सहमत है, लेकिन मेरे मामले में मैं सिर्फ एक विशेषता में मूल जांच करना चाहता हूं ' [कस्टम एट्रिब्यूट (टाइपऑफ (क्लासनाम))] और मुझे इंटरफ़ेस को लागू करने के लिए क्लासनाम की आवश्यकता है। कोड में लेटर, मैं सामान्य दोनों गुणों को जानता हूं और क्लासनाम का नया उदाहरण बनाने के लिए प्रतिबिंब का उपयोग कर सकता हूं –

संबंधित मुद्दे