11
votes

.NET Réflexion: Détection Ienumerable

J'essaie de détecter si une instance particulière d'un objet de type est un "iEnumerable" générique ...

Le meilleur que je puisse arriver est: P>

// theType might be typeof(IEnumerable<string>) for example... or it might not
bool isGenericEnumerable = theType.GetGenericTypeDefinition() == typeof(IEnumerable<object>).GetGenericTypeDefinition()
if(isGenericEnumerable)
{
    Type enumType = theType.GetGenericArguments()[0];
    etc. ...// enumType is now typeof(string) 


1 commentaires

S'il vous plaît voir mon suivi: Stackoverflow.com/Questtions/1650310/...


3 Réponses :


22
votes

Vous pouvez utiliser

if(theType.IsGenericType && theType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
{
    Type underlyingType = theType.GetGenericArguments()[0];
    //do something here
}


3 commentaires

Si le type n'est pas générique, il lancera un InvalidOperationException - pas une très bonne solution pour une chèque IMHO.


Cela ne fonctionne que si 'TeType' est exactement de typeOf (iEnumerable <>), pas si le type implémente l'interface. J'espère que c'est ce que vous êtes après.


Le "type" est en fait un type de paramètre d'entrée - donc je veux vraiment savoir si c'est exactement iénumérable et pas seulement convertimer à iénumérable ... En fait, je vais poser une autre question car celle-ci est répondu effectivement.



2
votes

Notez que vous ne pouvez pas appeler getgenerictypeDefinition () sur un type non générique, par conséquent, vérifiez d'abord avec isgénéricype .

Je ne sais pas si tu veux Pour vérifier si un type implémente un générique <> ou si vous souhaitez voir si un type d'interface est ienumerable <> . Pour le premier cas, utilisez le code suivant (la vérification interne avec interfaceType est le second cas): xxx


2 commentaires

Ce code fait-il référence à l'interface hérité (non générique) iEnumerable?


Oui, parce que le générique implique le non-générique, c'est un contrôle rapide pour vous assurer qu'il vaut la peine d'aller sur les interfaces du tout. Si iEnumerable (non générique) n'est pas implémenté, ienumerable <> (générique) ne peut pas non plus être.



4
votes

Vous pouvez utiliser cette pièce de code pour déterminer si un type particulier implémente l'interface ienumerable code>.

Type type = typeof(ICollection<string>);

bool isEnumerable = type.GetInterfaces()       // Get all interfaces.
    .Where(i => i.IsGenericType)               // Filter to only generic.
    .Select(i => i.GetGenericTypeDefinition()) // Get their generic def.
    .Where(i => i == typeof(IEnumerable<>))    // Get those which match.
    .Count() > 0;


1 commentaires

Au lieu de où (). Comptez () Vous pouvez utiliser n'importe quel ().