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)
3 Réponses :
Vous pouvez utiliser
if(theType.IsGenericType && theType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { Type underlyingType = theType.GetGenericArguments()[0]; //do something here }
Si le type n'est pas générique, il lancera un InvalidOperationException code> - 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.
Notez que vous ne pouvez pas appeler Je ne sais pas si tu veux Pour vérifier si un type implémente un getgenerictypeDefinition () code> sur un type non générique, par conséquent, vérifiez d'abord avec
isgénéricype code>.
générique <> code> ou si vous souhaitez voir si un type d'interface est
ienumerable <> code>. Pour le premier cas, utilisez le code suivant (la vérification interne avec
interfaceType code> est le second cas): p>
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 code> (non générique) n'est pas implémenté,
ienumerable <> code> (générique) ne peut pas non plus être.
Vous pouvez utiliser cette pièce de code pour déterminer si un type particulier implémente l'interface ienumerable
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;
Au lieu de où (). Comptez () Vous pouvez utiliser n'importe quel ().
S'il vous plaît voir mon suivi: Stackoverflow.com/Questtions/1650310/...