with parameter multiple method generic create .net generics reflection

.net - parameter - ¿Cuál es la diferencia entre un tipo genérico y una definición de tipo genérico?



reflection c# (2)

Estoy estudiando sobre la reflexión de .net y me está costando descubrir la diferencia.

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

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

¡Gracias!


En su ejemplo, la List<T> es una definición de tipo genérico. T se llama un parámetro de tipo genérico. Cuando el parámetro type se especifica como en List<string> o List<int> o List<double> entonces tiene un tipo genérico. Puedes verlo ejecutando 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 se 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 la definición de tipo genérico directamente es typeof(List<>) o typeof(Dictionary<,>) .


Esto ayudará a explicarlo 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, obtendrá la primera prueba para 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 está comparando el genérico original antes de definir T

El tipo IsGenericType solo está verificando si se ha definido la T genérica. IsGenericTypeDefinition verifica que la T genérica NO haya sido definida. Esto es útil si desea saber si dos objetos se han definido a partir del mismo tipo genérico base, como el primer ejemplo de List<T> .