Je souhaite effectuer un test si un objet est de type générique. J'ai essayé ce qui suit sans succès:
public bool Test()
{
List<int> list = new List<int>();
return list.GetType() == typeof(List<>);
}
Qu'est-ce que je fais mal et comment effectuer ce test?
Je suppose que vous ne voulez pas seulement savoir si le type est générique, mais si un objet est une instance d'un type générique particulier, sans connaître les arguments de type.
Ce n'est malheureusement pas très simple. Ce n'est pas trop mal si le type générique est une classe (comme c'est le cas dans ce cas) mais c'est plus difficile pour les interfaces. Voici le code d'une classe:
EDIT: Comme indiqué dans les commentaires, cela peut fonctionner pour les interfaces:
J'ai un soupçon sournois qu'il peut y avoir des cas délicats à ce sujet, mais je ne peux pas en trouver un pour lequel il échoue pour le moment.
la source
List<T>
sous une forme ou une autre. Si vous incluez des interfaces, c'est vraiment délicat.IsInstanceOfGenericType
par un appel àIsAssignableFrom
au lieu de l'opérateur d'égalité (==
)?Vous pouvez utiliser du code plus court en utilisant dynamique bien que cela puisse être plus lent que la réflexion pure:
la source
Ce sont mes deux méthodes d'extension préférées qui couvrent la plupart des cas marginaux de vérification de type générique:
Marche avec:
A une surcharge qui `` sortira '' le type générique spécifique s'il renvoie true (voir le test unitaire pour des exemples):
Voici un test pour démontrer la fonctionnalité (de base):
la source
la source