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.