Pourquoi Type.GetElementType renvoie-t-il la valeur null?

J’ai une méthode qui prend comme paramètre d’entrée un object de type IEnumerable . Je veux énumérer l’énumération et utiliser pour chaque élément la reflection pour obtenir la valeur de chaque propriété.

J’ai le code suivant:

 protected void WriteData(IEnumerable data) { var enumerationTypeInfo = data.GetType(); var itemTypeInfo = enumerationTypeInfo.GetElementType(); ... } 

Le problème est enumerationTypeInfo.GetElementType() renvoie toujours la valeur null . En particulier, je passe une List à WriteData , où Entry est une classe que j’ai créée. Lorsque j’utilise le débogueur et que je définis un point d’arrêt, je peux voir que enumerationTypeInfo indique correctement qu’il s’agit d’une liste de type Entry , mais pourquoi GetElementType renvoie-il la valeur null ?

Merci

GetElementType est destiné à être utilisé avec des tableaux, pas avec d’autres classes génériques. Pour obtenir les parameters génériques d’un type générique, vous pouvez utiliser Type.GetGenericArguments .

GetElementType() renvoie le type d’élément des tableaux. List n’est pas un type de tableau et n’a donc aucun “type d’élément”.

Si vous voulez obtenir le type d’éléments produit par IEnumerable hasard, essayez ceci:

 public static Type GetEnumerableType(Type type) { if (type == null) throw new ArgumentNullException("type"); if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) return type.GetGenericArguments()[0]; var iface = (from i in type.GetInterfaces() where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>) select i).FirstOrDefault(); if (iface == null) throw new ArgumentException("Does not represent an enumerable type.", "type"); return GetEnumerableType(iface); } 

Notez que les types peuvent implémenter plusieurs versions de la même interface générique. un type peut implémenter à la fois IEnumerable et IEnumerable par exemple. Comment vous gérez cette affaire, c’est à vous de décider. La méthode que je fournis prendra le type d’interface que le moteur d’exécution lui donne en premier.


Voir un exemple en utilisant la méthode ci-dessus sur ideone.