2012-01-16 19 views
14

मैं इस तरह एक सामान्य इंटरफ़ेस मिला:एक सामान्य इंटरफ़ेस का प्रकार प्राप्त करें?

public interface IResourceDataType<T> 
{ 
    void SetResourceValue(T resValue); 
} 

तब मैं इस वर्ग है कि मेरी इंटरफ़ेस लागू करता है:

public class MyFont : IResourceDataType<System.Drawing.Font> 
{ 
    //Ctor + SetResourceValue + ... 
} 

और अंत में मैं एक मिल गया:

var MyType = typeof(MyFont); 

मैं, अब , System.Drawing.Font प्राप्त करना चाहते हैं MyType से टाइप करें! पल में, मैं इस कोड है:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    //If test is OK 
} 

लेकिन मैं यहां अपने प्रकार "निकालने" के लिए प्रबंधन नहीं है ... मैं GetGenericArguments() और अन्य बातों के साथ चीजों की एक जोड़ी की कोशिश की लेकिन वे या तो डॉन ' टी संकलित या एक शून्य मूल्य/सूची वापस ... मुझे क्या करना है?

संपादित करें:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    foreach (Type type in MyType.GetInterfaces()) 
    { 
     if (type.IsGenericType) 
      Type genericType = type.GetGenericArguments()[0]; 
     } 
    } 
} 
+0

क्या आपने यह पोस्ट देखा है: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t –

+0

हाँ, और एक जोड़े किसी और के, वे मेरे प्रश्न का उत्तर नहीं देते ... मेरी भावना यह है कि मुझे GetInterfaces() का उपयोग करना है और कुछ अन्य चीजें करना है, मैं वास्तव में इसे आजमा रहा हूं! –

उत्तर

10

के बाद से अपने MyFont वर्ग केवल एक ही इंटरफ़ेस लागू करता है, तो आप लिख सकते हैं::

Type myType = typeof(MyFont).GetInterfaces()[0].GetGenericArguments()[0]; 
यहाँ समाधान है कि जो लोग एक ही समस्या मिल जाएगा के लिए मेरे कोड फिट है

यदि आपकी कक्षा कई इंटरफेस लागू करती है, तो आप GetInterface() विधि को इंटरफ़ेस के उलझन वाले नाम के साथ कॉल कर सकते हैं:

Type myType = typeof(MyFont).GetInterface("IResourceDataType`1") 
          .GetGenericArguments()[0]; 
+0

मैं यही कोशिश कर रहा हूं, लेकिन मैं बहु-इंटरफेस को कार्यान्वित करता हूं, जो कि मेरी समस्या का पर्दाफाश करने के लिए सिर्फ एक स्निपेट था! –

+0

मैं अंतिम समाधान के साथ "संपादित करें", मैं इसके करीब हूं –

+0

आपको 'GetInterface()' का उपयोग करना होगा, फिर मेरा अद्यतन उत्तर देखें। –

1
var fontTypeParam = typeof(MyFont).GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Where(i => i.GetGenericTypeDefinition() == typeof(IResourceDataType<>)) 
    .Select(i => i.GetGenericArguments().First()) 
    .First() 
    ; 

यह आपको इंटरफ़ेस का नाम बदलने के बारे में चिंता का ख्याल रखता है। कोई स्ट्रिंग अक्षर नहीं है, इसलिए विजुअल स्टूडियो में एक नाम आपकी खोज अभिव्यक्ति को अपडेट करना चाहिए।

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