Disons que j'ai un membre générique dans une classe ou une méthode, donc:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Quand j'instancier la classe, le T
devient MyTypeObject1
, si la classe a une propriété de liste générique: List<MyTypeObject1>
. La même chose s'applique à une méthode générique dans une classe non générique:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Je voudrais savoir quel type d'objets contient la liste de ma classe. Ainsi, la propriété list appelée Bar
ou la variable locale baz
, contient quel type de T
?
Je ne peux pas le faire Bar[0].GetType()
, car la liste peut contenir zéro élément. Comment puis-je le faire?
object
,IList
ou similaire - mais cela pourrait très bien être la bonne réponse.typeof
. Si vous voulez connaître le type de T, utilisez simplementtypeof(T)
:)typeof()
un paramètre générique. Avez-vous un exemple où cela ne fonctionnerait pas? Ou confondez-vous les paramètres de type et les références?(note: je suppose que tout ce que vous savez est
object
ouIList
ou similaire, et que la liste peut être de n'importe quel type au moment de l'exécution)Si vous savez que c'est un
List<T>
, alors:Une autre option consiste à regarder l'indexeur:
Utilisation de la nouvelle TypeInfo:
la source
Avec la méthode d'extension suivante, vous pouvez vous évader sans réflexion:
Ou plus général:
Usage:
la source
T
au moment de la compilation. Dans ce cas, vous n'avez vraiment pas besoin de code.ItemType
Essayer
la source
GetGenericArguments
méthode renvoie un objet Array deType
, dont vous devez ensuite analyser la position du type générique dont vous avez besoin. Tels queType<TKey, TValue>
: vous devezGetGenericArguments()[0]
obtenir leTKey
type etGetGenericArguments()[1]
obtenir leTValue
typeC'est du travail pour moi. Où myList est une sorte de liste inconnue.
la source
<T>
)List
est déjà une implémentation deIEnumerable
, donc la distribution ne semble rien ajouter. Mais merci, c'est une bonne solution.Si vous n'avez pas besoin de la variable Type entière et que vous voulez simplement vérifier le type, vous pouvez facilement créer une variable temporaire et utiliser son opérateur.
la source
Vous pouvez utiliser celui-ci pour le type de retour de liste générique:
la source
Considérez ceci: je l'utilise pour exporter 20 listes dactylographiées de la même manière:
la source
new T();
ferait la même chose que(T)Activator.CreateInstance(typeof(T));
. Cela nécessite que vous ajoutiezwhere T : new()
à la définition de classe / fonction, mais si vous voulez créer des objets, cela devrait être fait de toute façon.GetType
uneFirstOrDefault
entrée entraînant une exception de référence null potentielle. Si vous êtes sûr qu'il retournera au moins un article, pourquoi ne pas l'utiliser à laFirst
place?J'utilise cette méthode d'extension pour accomplir quelque chose de similaire:
Vous l'utilisez comme ceci:
Ce n'est pas tout à fait ce que vous recherchez, mais c'est utile pour démontrer les techniques impliquées.
la source
La
GetGenericArgument()
méthode doit être définie sur le type de base de votre instance (dont la classe est une classe génériquemyClass<T>
). Sinon, il renvoie un type [0]Exemple:
la source
Vous pouvez obtenir le type de "T" à partir de n'importe quel type de collection qui implémente IEnumerable <T> avec les éléments suivants:
Notez qu'il ne prend pas en charge les types de collection qui implémentent IEnumerable <T> deux fois, par exemple
Je suppose que vous pourriez renvoyer un tableau de types si vous aviez besoin de prendre en charge cela ...
En outre, vous pouvez également vouloir mettre en cache le résultat par type de collection si vous faites beaucoup cela (par exemple dans une boucle).
la source
la source
Utilisation de la solution de 3dGrabber:
la source
Si vous souhaitez connaître le type sous-jacent d'une propriété, essayez ceci:
la source
C'est comme ça que je l'ai fait
Alors appelle ça comme ça
OU
la source
Type:
la source
SingleOrDefault()
lance égalementInvalidOperationException
lorsqu'il y a deux éléments ou plus.