Comment vérifier si une variable est un IEnumerable

En gros, je construis un modèle T4 très générique et l’une des choses dont j’ai besoin est de dire print variable.ToSsortingng() . Cependant, je souhaite qu’il évalue les listes et les annule, et imprime plutôt à la place ListItem.ToSsortingng() Mon modèle T4 ne sait pas quelle variable type sera en avance, c’est pourquoi il est si générique.

Mais mon code actuel qui est généré ressemble à ceci:

 if(variable!=null) if(variable is IEnumerable) //error here foreach(var item in variable) Write(item.ToSsortingng()); 

Je reçois une erreur de compilateur sur la ligne marquée pour “L’utilisation du type générique System.Generic.Collections.IEnumerable nécessite un argument de type”

Je ne me soucie pas vraiment de quel type il s’agit, je veux juste savoir si vous pouvez foreach à travers la variable. Quel code devrais-je utiliser à la place?

Cependant, vous avez déjà accepté une réponse, car IEnumerable générique IEnumerable implémente le IEnumerable non générique que vous pouvez simplement utiliser pour cela.

 // Does write handle null? Might need some sanity aswell. var enumerable = variable as System.Collections.IEnumerable; if (enumerable != null) foreach(var item in enumerable) Write(item); else Write(item); 

Si vous souhaitez tester IEnumerable non générique, vous devez inclure une directive using System.Collections en haut de votre fichier source.

Si vous voulez tester un type IEnumerable vous aurez besoin de quelque chose comme ceci:

 if (variable != null) { if (variable.GetType().GetInterfaces().Any( i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))) { // foreach... } } 

Les autres réponses ont souligné la différence générique / non générique IEnumerable, mais je tiens également à préciser que vous souhaiterez également tester Ssortingng, car il implémente IEnumerable, mais je doute que vous souhaitiez la traiter comme une collection de caractères.

En général , en l’absence de type / interface de base non générique, ceci nécessite GetType et une recherche récursive à travers les types / interfaces de base.

Cependant , cela ne s’applique pas ici 🙂 Utilisez simplement le IEnumerable non générique ( System.Collections.IEnumerable ), dont hérite le IEnumerable générique ( System.Collections.Generic.IEnumerable ).

Vous pouvez réellement tester directement la classe de base de tout type générique.

 instance.GetGenericTypeDefinition() == typeof(IEnumerable<>) 

Eh bien, un peu simple mais … si vous avez seulement:

 using System.Collections.Generic; 

vous devrez peut-être append:

 using System.Collections; 

Le premier définit IEnumerable et le dernier définit IEnumerable .

C’est une vieille question, mais je voulais montrer une méthode alternative pour déterminer si un SomeType est IEnumerable :

 var isEnumerable = (typeof(SomeType).Name == "IEnumerable`1");