Comment comparer les types

130

Question rapide: comment comparer un type Type (jeu de mots non prévu) avec un autre type en C #? Je veux dire, j'ai un Type typeFieldet je veux savoir si elle est System.String, System.DateTimeetc., mais typeField.Equals(System.String)ne fonctionne pas.

Un indice?

Archedius
la source

Réponses:

180

Essayez ce qui suit

typeField == typeof(string)
typeField == typeof(DateTime)

L' typeofopérateur en C # vous donnera un Typeobjet pour le type nommé. Typeles instances sont comparables à l' ==opérateur, c'est donc une bonne méthode pour les comparer.

Remarque: Si je me souviens bien, il y a des cas où cela se décompose lorsque les types impliqués sont des interfaces COM qui sont intégrées dans des assemblys (via NoPIA). Cela ne semble pas être le cas ici.

JaredPar
la source
75

Vous pouvez utiliser pour cela l' is opérateur . Vous pouvez ensuite vérifier si l'objet est de type spécifique en écrivant:

if (myObject is string)
{
  DoSomething()
}
Rafal Spacjer
la source
3
Vaut-il mieux pour nous "est" ou "typeof"?
Brent Wagoner
32

Vous pouvez comparer exactement le même type en utilisant:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof renvoie l'objet Type d'une classe donnée.

Mais si vous avez un type B, qui hérite de A, alors cette comparaison est fausse. Et vous recherchez IsAssignableFrom .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}
GvS
la source
7

Si votre instance est Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

mais si votre instance est un objectet non un, Typeutilisez l' asopérateur:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

cela présente l'avantage de valuene convertir qu'une seule fois dans le type spécifié.

Syntonie
la source