web-dev-qa-db-fra.com

Comment vérifier si le type de variable correspond à Type stocké dans une variable

User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

Comment puis-je tester si une variable est d'un type de cette manière?

86
Karan

Les autres réponses contiennent toutes des omissions importantes.

L'opérateur is effectue pas vérifie si le type d'exécution de l'opérande est exactement le type donné; au contraire, il vérifie si le type d'exécution est compatible avec le type donné:

class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.

Mais vérifier pour le type identité avec vérification de la réflexion pour identité, pas pour compatibilité

bool b3 = x.GetType() == typeof(Tiger); // true
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal

Si ce n'est pas ce que vous voulez, vous voudrez probablement IsAssignableFrom:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
185
Eric Lippert

GetType() existe sur chaque type de framework, car il est défini sur le type de base object. Donc, quel que soit le type, vous pouvez l’utiliser pour retourner le sous-jacent Type

Donc, tout ce que vous avez à faire est:

u.GetType() == t
13
Dave Bish

Vous devez voir si le type de votre instance est égal au type de la classe. Pour obtenir le type de l'instance, utilisez la méthode GetType() :

 u.GetType().Equals(t);

ou

 u.GetType.Equals(typeof(User));

devrait le faire. Évidemment, vous pouvez utiliser '==' pour faire votre comparaison si vous préférez.

9
Sam Holder

Afin de vérifier si un objet est compatible avec une variable de type donnée, au lieu d'écrire

u is t

tu devrais écrire

typeof(t).IsInstanceOfType(u)
4
Mantas Janulionis