2010-04-02 25 views
17

Estoy estudiando en .net reflexión y estoy teniendo dificultades para descubrir la diferencia.¿Cuál es la diferencia entre un tipo genérico y una definición de tipo genérico?

Por lo que entiendo, List<T> es una definición de tipo genérico. ¿Eso significa que para .net reflection T es el tipo genérico?

Específicamente, creo que estoy buscando más información sobre las funciones Type.IsGenericType y Type.IsGenericTypeDefinition.

Gracias!

Respuesta

25

En su ejemplo, List<T> es una definición de tipo genérico. T se llama parámetro de tipo genérico. Cuando se especifica el parámetro type como en List<string> o List<int> o List<double>, entonces tiene un tipo genérico. Se puede ver que mediante la ejecución de un código como este ...

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

que imprimirá

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. 

Otra forma de obtener el tipo de definición genérica es directamente typeof(List<>) o typeof(Dictionary<,>).

+0

Ahhhh y todo tiene sentido ahora – Micah

+0

Gran explicación. – wonde

2

Esto le ayudará a entender que tal vez:

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

Si lo ejecuta usted conseguirá la primera prueba a pasar porque ambos elementos están implementando el tipo List<T>. La segunda prueba falla porque List<string> no es lo mismo que List<int>. La definición de tipo genérico es la comparación del genérico original antes de definir T.

El tipo IsGenericType solo está comprobando si se ha definido el genérico T. IsGenericTypeDefinition comprueba que el genérico T NO ha sido definido. Esto es útil si desea saber si se han definido dos objetos a partir del mismo tipo genérico básico, como el primer ejemplo List<T>.

Cuestiones relacionadas