2010-04-02 3 views
17

Я изучаю отражение .net, и мне сложно определить разницу.В чем разница между типичным типом и определением общего типа?

Из того, что я понимаю, List<T> является общим определением типа. Означает ли это, что для .net-отражения T является общим типом?

В частности, я предполагаю, что я ищу больше фона для функций Type.IsGenericType и Type.IsGenericTypeDefinition.

Спасибо!

ответ

25

В вашем примере List<T> является общим определением типа. T называется параметром общего типа. Когда параметр типа указан как в List<string> или List<int> или List<double>, тогда у вас есть общий тип. Вы можете видеть, что, запустив код, как это ...

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);  
} 

Что напечатает

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. 

Другой способ получить общее определение типа непосредственно является typeof(List<>) или typeof(Dictionary<,>).

+0

Ahhhh и все это имеет смысл сейчас – 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>.

Смежные вопросы