2009-12-06 8 views
8

सबसे अच्छा तरीका है इस उदाहरण कोड के साथ है:जेनेरिक तर्क के लिए अप्रासंगिक, जेनेरिक प्रकार के साथ ऑब्जेक्ट के प्रकार की तुलना कैसे करें? मेरे सवाल का वर्णन करने के लिए

class Item {} 
    class Container<T> {} 
    class Program 
    { 
    static void DoSomething(object something) 
    { 
     if(typeof(Item) == something.GetType()) 
     { 
     System.Console.WriteLine("Item"); 
     } 
     else if(typeof(Container<>) == something.GetType()) 
     { 
     System.Console.WriteLine("Container<>"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     DoSomething(new Item()); 
     DoSomething(new Container<int>()); 
    } 
    } 

निम्न पंक्ति काम नहीं करेगा:

else if(typeof(Container<>) == something.GetType()) 

यह यह स्पष्ट रूप से Container<int> में Container<> बदले बिना काम करने के लिए कोई तरीका है? मैं जानना चाहता हूं कि ऑब्जेक्ट 'कंटेनर' प्रकार का है और मुझे वास्तव में कोई दिलचस्पी नहीं है Container<int> या Container<string>। प्रतिबिंब के दर्जनों लाइनों के अलावा कोई संकेत?

उत्तर

23

प्रयास करें:

typeof(Container<>) == something.GetType().GetGenericTypeDefinition() 

ध्यान दें कि यह केवल सच वापस आ जाएगी अगर वास्तविक प्रकार Container<T> है। यह व्युत्पन्न प्रकारों के लिए काम नहीं करता है। उदाहरण के लिए, यह निम्नलिखित के लिए false वापसी करेंगे:

class StringContainer : Container<string> 

आप इसे इस मामले के लिए काम करने की जरूरत है, तो आप वंशानुगत पदानुक्रम पार और Container<T> होने के लिए प्रत्येक आधार वर्ग का परीक्षण करना चाहिए:

static bool IsGenericTypeOf(Type genericType, Type someType) 
{ 
    if (someType.IsGenericType 
      && genericType == someType.GetGenericTypeDefinition()) return true; 

    return someType.BaseType != null 
      && IsGenericTypeOf(genericType, someType.BaseType); 
} 
संबंधित मुद्दे