116 votes

obtention du type T à partir de IEnumerable<T>

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.

1 votes

Dans quel contexte ? Qu'est-ce que cet IEnumerable<T> ? Est-ce une instance d'objet envoyée comme argument ? Ou quoi ?

0voto

Daniel Brückner Points 36242

typeof(IEnumerable<Foo>) . GetGenericArguments()[0] retournera le premier argument générique - dans ce cas-ci typeof(Foo) .

0voto

H7O Points 1

C'est ainsi que je procède habituellement (par la méthode de l'extension) :

public static Type GetIEnumerableUnderlyingType<T>(this T iEnumerable)
    {
        return typeof(T).GetTypeInfo().GetGenericArguments()[(typeof(T)).GetTypeInfo().GetGenericArguments().Length - 1];
    }

0voto

Ken Kin Points 1604

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.com

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.

Powered by:

X