2011-02-06 17 views
7

lista genérica:resultado confusa de "GetElementType" en las matrices y listas genéricas

var elementType1 = typeof (List<A>).GetElementType(); 

Matriz:

var elementType = typeof (A[]).GetElementType(); 

¿Por qué sólo obtener el tipo de elemento de una matriz? ¿Cómo podría obtener el tipo de elemento de una lista genérica? (observación: la lista genérica está encuadrada)

+0

Podría aclarar lo que su observación "de la lista genérica se encajona" medios? – Ani

+0

en caja significa que solo tiene esta lista como un objeto. – Rookian

+0

Eso no es boxeo. El boxeo solo se aplica a los tipos de valores. – Ani

Respuesta

12

GetElementType solo obtiene el tipo de elemento para matriz, puntero y tipos de referencia.

Cuando se reemplaza en una clase derivada , devuelve el tipo del objeto abarcado que se refiere por el matriz actual, el puntero o referencia tipo

La API de reflexión no "sabe "que List<T> es un contenedor genérico y que el argumento de tipo de uno de sus tipos construidos es representativo del tipo de los elementos que contiene.

Utilice el método GetGenericArguments en lugar de obtener el tipo-argumentos del tipo construido:

var elementType1 = typeof(List<A>).GetGenericArguments().Single(); 
+0

¿existe también un buen enfoque para averiguar si tengo una lista genérica o una matriz? Podría probar nulo y luego usar su solución, pero tal vez haya algo mejor. – Rookian

+1

Array = 'type.IsArray'. ListT = 'type.GetGenericTypeDefinition() == typeof (List <>)' (También deberá verificar que el tipo sea un tipo genérico construido). – Ani

4
var elementType1 = typeof(List<A>).GetGenericArguments()[0]; 
var elementType = typeof(int[]).GetElementType(); 
Cuestiones relacionadas