Comment faire pour déterminer si un type est un type de collection?
Je suis en train d'essayer de déterminer si un runtime type est une sorte de type de collection. Ce que j'ai ci-dessous fonctionne, mais il semble étrange que j'ai pour nom les types que je crois être les types de collection dans un tableau comme je l'ai fait.
Dans le code ci-dessous, la raison pour le générique de la logique en est que, dans mon application, je m'attends à toutes les collections génériques.
bool IsCollectionType(Type type)
{
if (!type.GetGenericArguments().Any())
return false;
Type genericTypeDefinition = type.GetGenericTypeDefinition();
var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) };
return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition));
}
Comment aurais-je refactoriser ce code pour être plus intelligent ou plus simple?
- Une chose à garder à l'esprit est que vous n'avez généralement pas envisager de
string
comme une collection dechar
s, même si elle met en œuvreIEnumerable<char>
.
Vous devez vous connecter pour publier un commentaire.
Vraiment tous ces types héritent
(IEnumerable
. Vous pouvez vérifier que:ou si vous avez vraiment besoin de vérifier pour ICollection:
Regardez la "Syntaxe" de la partie:
List<T>
IList
ICollection
IEnumerable
a le problème d'une mauvaise interprétation destring
comme une collection. Ce n'est pas souhaitable, la plupart du temps.ICollection<CPerson>
retournénull
surtype.GetInterface("ICollection")
et surtype.GetInterface("System.Collections.Generic.ICollection")
nameof(ICollection)
à la place.nameof(System.Collections.IEnumerable)
, dans mon cas, j'ai une référence àusing System.Collections.Generic;
et c'était une confusion avecSystem.Collections.Generic.IEnumerable<T>
.Je sais que ce fil est vieux, mais ici est un exemple moderne au 20 juillet 2015, selon Microsoft est mot-clé.
Vous pouvez utiliser cette méthode d'aide à vérifier si un type implémente une ouverture d'interface générique. Dans votre cas, vous pouvez utiliser
DoesTypeSupportInterface(type, typeof(Collection<>))
Ou vous pouvez vérifier simplement la non générique
IEnumerable
. Collection de toutes les interfaces hériter d'elle. Mais je ne voudrais pas appeler n'importe quel type qui implémenteIEnumerable
une collection.Tous hériter IEnumerable(), ce qui signifie vérifier son là devrait être suffisant:
Vous pouvez utiliser linq, recherche pour un nom d'interface comme
Si cela a des valeurs est une instance de
IEnumerable
.