2011-02-06 14 views
7

elenco generico:risultato confuso di "GetElementType" su array e liste generiche

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

Array:

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

Perché ho solo il tipo di elemento di un array? Come posso ottenere il tipo di elemento di una lista generica? (nota: l'elenco generico è in scatola)

+0

Potrebbe chiarire ciò che la sua osservazione "l'elenco generico è inscatolato" significa? – Ani

+0

in scatola significa che si ha solo questo elenco come oggetto. – Rookian

+0

Questo non è il pugilato. La boxe si applica solo ai tipi di valore. – Ani

risposta

12

GetElementType ottiene solo il tipo di elemento per i tipi di matrice, puntatore e riferimento.

Quando override in una classe derivata, restituisce il tipo dell'oggetto racchiuso o menzionato dalla corrente matrice, puntatore o riferimento tipo

L'API riflessione non "sa "che List<T> è un contenitore generico e che l'argomento tipo di uno dei suoi tipi costruiti è rappresentativo del tipo di elementi che contiene.

Utilizzare il metodo GetGenericArguments invece per ottenere il tipo-argomenti del tipo costruito:

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

c'è anche un buon approccio per scoprire se ho una lista generica o un array? Potrei provare per null e quindi usare la tua soluzione, ma forse c'è qualcosa di meglio. Array – Rookian

+1

= 'type.IsArray'. ListT = 'type.GetGenericTypeDefinition() == typeof (Elenco <>)' (Devi anche verificare che il tipo sia un tipo generico costruito). – Ani

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