Existe-t-il un moyen de récupérer le type T
de IEnumerable<T>
par la réflexion ?
par exemple
j'ai une variable IEnumerable<Child>
info ; Je veux récupérer le type de l'enfant par réflexion.
Existe-t-il un moyen de récupérer le type T
de IEnumerable<T>
par la réflexion ?
par exemple
j'ai une variable IEnumerable<Child>
info ; Je veux récupérer le type de l'enfant par réflexion.
typeof(IEnumerable<Foo>)
. GetGenericArguments()
[0]
retournera le premier argument générique - dans ce cas-ci typeof(Foo)
.
Voici ma version illisible de l'expression de requête Linq
public static Type GetEnumerableType(this Type t) {
return !typeof(IEnumerable).IsAssignableFrom(t) ? null : (
from it in (new[] { t }).Concat(t.GetInterfaces())
where it.IsGenericType
where typeof(IEnumerable<>)==it.GetGenericTypeDefinition()
from x in it.GetGenericArguments() // x represents the unknown
let b = it.IsConstructedGenericType // b stand for boolean
select b ? x : x.BaseType).FirstOrDefault()??typeof(object);
}
Notez que la méthode prend également en compte les données non génériques IEnumerable
en tenant compte, il renvoie object
dans ce cas, car il prend un Type
plutôt qu'une instance concrète comme argument. D'ailleurs, pour x représente l'inconnue J'ai trouvé cette vidéo Intéressant, bien qu'il ne soit pas pertinent
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Dans quel contexte ? Qu'est-ce que cet IEnumerable<T> ? Est-ce une instance d'objet envoyée comme argument ? Ou quoi ?