Type t = typeof(obj1);
if (t == typeof(int))
// Some code here
C'est une erreur. L'opérateur typeof en C# ne peut prendre les noms de type, pas des objets.
if (obj1.GetType() == typeof(int))
// Some code here
Cela fonctionne, mais peut-être pas comme vous le souhaiteriez. Pour les types de valeur, que vous ai montré ici, c'est acceptable, mais pour les types référence, il ne renvoie vrai si le type était exactement le même type, pas quelque chose d'autre dans la hiérarchie d'héritage. Par exemple:
class Animal{}
class Dog : Animal{}
static void Foo(){
object o = new Dog();
if(o.GetType() == typeof(Animal))
Console.WriteLine("o is an animal");
Console.WriteLine("o is something else");
}
Ce serait d'imprimer "o is something else"
, car le type d' o
est Dog
, pas Animal
. Vous pouvez faire ce travail, cependant, si vous utilisez l' IsAssignableFrom
méthode de Type
classe.
if(typeof(Animal).IsAssignableFrom(o.GetType())) // note use of tested type
Console.WriteLine("o is an animal");
Cette technique laisse tout de même un problème majeur, cependant. Si votre variable est null, l'appel à l' GetType()
lèvera une exception NullReferenceException. Donc, pour le faire fonctionner correctement, vous devriez faire:
if(o != null && typeof(Animal).IsAssignableFrom(o.GetType()))
Console.WriteLine("o is an animal");
Avec cela, vous avez l'équivalent comportement de l' is
mot-clé. Par conséquent, si c'est le comportement que vous voulez, vous devez utiliser l' is
mot-clé, qui est plus lisible et plus efficace.
if(o is Animal)
Console.WriteLine("o is an animal");
Ce qui est peut-être encore mieux, cependant, est d'utiliser l' as
mot-clé, si vous avez besoin de faire plus que de simplement vérifier que quelque chose est d'un certain type, mais aussi de l'utilisation que l'objet en tant que type.
Par exemple, ne pas faire ceci:
if(o is Animal)
((Animal)o).Speak();
Au lieu de cela, faire ceci:
Animal a = o as Animal;
if(a != null)
a.Speak();