2010-04-02 13 views
17

मैं .NET प्रतिबिंब पर पढ़ रहा हूं और अंतर को समझने में कठिनाई हो रही है।सामान्य प्रकार और सामान्य प्रकार की परिभाषा के बीच क्या अंतर है?

जो मैं समझता हूं, List<T> एक सामान्य प्रकार की परिभाषा है। क्या इसका मतलब है कि .NET प्रतिबिंब टी सामान्य प्रकार है?

विशेष रूप से, मुझे लगता है कि मैं Type.IsGenericType और Type.IsGenericTypeDefinition फ़ंक्शंस पर अधिक पृष्ठभूमि की तलाश में हूं।

धन्यवाद!

उत्तर

25

आपके उदाहरण में List<T> एक सामान्य प्रकार की परिभाषा है। T को सामान्य प्रकार पैरामीटर कहा जाता है। जब टाइप पैरामीटर List<string> या List<int> या List<double> में निर्दिष्ट किया गया है तो आपके पास एक सामान्य प्रकार है। आप देख सकते हैं कि इस तरह की कुछ कोड चलाकर ...

System.Collections.Generic.List`1[System.String] //The Generic Type. 
True //This is a generic type. 
False //But it isn't a generic type definition because the type parameter is specified 
System.Collections.Generic.List`1[T] //The Generic Type definition. 
True //This is a generic type too.        
True //And it's also a generic type definition. 

public static void Main() 
{ 
    var l = new List<string>(); 
    PrintTypeInformation(l.GetType()); 
    PrintTypeInformation(l.GetType().GetGenericTypeDefinition()); 
} 

public static void PrintTypeInformation(Type t) 
{ 
    Console.WriteLine(t); 
    Console.WriteLine(t.IsGenericType); 
    Console.WriteLine(t.IsGenericTypeDefinition);  
} 

कौन सा प्रिंट होगा सामान्य प्रकार परिभाषा सीधे typeof(List<>) या typeof(Dictionary<,>) है पाने के लिए एक और तरीका है।

+0

अहह्ह और यह सब अब समझ में आता है – Micah

+0

ग्रेट स्पष्टीकरण। – wonde

2

इससे यह शायद व्याख्या करते हैं:

List<string> lstString = new List<string>(); 
List<int> lstInt = new List<int>(); 

if (lstString.GetType().GetGenericTypeDefinition() == 
    lstInt.GetType().GetGenericTypeDefinition()) 
{ 
    Console.WriteLine("Same type definition."); 
} 

if (lstString.GetType() == lstInt.GetType()) 
{ 
    Console.WriteLine("Same type."); 
} 

आप इसे चलाते हैं, तो पहले आपको परीक्षा उत्तीर्ण क्योंकि दोनों आइटम प्रकार List<T> कार्यान्वित कर रहे हैं मिल जाएगा। दूसरा परीक्षण विफल रहता है क्योंकि List<string>List<int> जैसा नहीं है। जेनेरिक टाइप परिभाषा T से पहले मूल जेनेरिक की तुलना कर रही है।

IsGenericType प्रकार सिर्फ यह जांच रहा है कि जेनेरिक T परिभाषित किया गया है या नहीं। IsGenericTypeDefinition यह देखने के लिए जांच करता है कि जेनेरिक T परिभाषित नहीं किया गया है। यह उपयोगी है अगर आप जानना चाहते हैं कि दो ऑब्जेक्ट्स को उसी बेस जेनेरिक प्रकार से परिभाषित किया गया है जैसे कि पहले List<T> उदाहरण।

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