C# - Obtenir le type d'élément pour une liste générique
Quelle serait la meilleure façon d'obtenir le type des éléments à une liste générique contient? Il est assez facile de saisir le premier élément de la collection et de l'appeler .GetType(), mais je ne peux pas toujours être sûr qu'il y aura un élément dans la collection.
L'espoir qui fait sens.
Merci,
Sonny
- Que savez-vous sur le type déjà? Pourriez-vous fournir un exemple de contexte?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
Type.GetGenericArguments
méthode à cette fin.T
jeton est dans la portée (par exemple, dans une méthode qui accepte unList<T>
), vous pouvez également utilisertypeof(T)
. Si leList<T>
est stockée dans une variable de typeobject
, vous devrez utiliser l'approche décrite ci-dessus..Single()
ne fonctionne que dans .Net >= 3.5 😉Pour une approche plus solide:
Mais si votre variable est typée
List<T>
vous pouvez simplement utilisertypeof(T)
. Par exemple:Remarque que vous n'avez pas vraiment besoin de
someList
paramètre. Cette méthode est juste un exemple de comment vous pouvez utilisertypeof
si vous êtes déjà dans une méthode générique. Vous avez seulement besoin d'utiliser la réflexion approche si vous n'avez pas accès à laT
jeton (la liste est stockée dans un non-générique de type de variable, comme on tapéIList
,object
, etc.).Voici une autre façon, qui travaille pour les non-générique collections, trop:
C'est, obtenir le type de retour de
foo[x]
, oùfoo
est du type spécifié.Exemples:
La
GetItemType
méthode ci-dessus a quelques problèmes, mais:Il jette à un
NullReferenceException
si le type n'a pas d'indexation de l'opérateur.Il jette un
AmbiguousMatchException
si le type a plusieurs surcharges de l'opérateur d'indexation (par exemplethis[string]
etthis[int]
).Ici est une version plus raffinée:
Ce, tout est statique (par exemple, pas obligatoire), et rapide (pas de boucles, pas de l'utilisation de linq), et c'est simple 🙂 ces travaux pour les collections:
Et quelques petits tests unitaires:
Avis le fait qu'il y a deux façons de regarder cela, un type peut être renvoyée par l'indexeur et d'un autre type peuvent être retournés par l'agent recenseur. L'unité de test ne montrent à la fois.
Avoir du plaisir,
Frans.
P. s. Pour enumerables:
Et pour l'enquêteur:
Vieille question nouvelle méthode avec
dynamic