Cómo comparar tipos

130

Pregunta rápida: ¿cómo comparar un tipo de Tipo (juego de palabras no previsto) con otro tipo en C #? Quiero decir, tengo una Type typeFieldy me gustaría saber si se trata de System.String, System.DateTime, etc, pero typeField.Equals(System.String)no funciona.

¿Cualquier pista?

Archedius
fuente

Respuestas:

180

Intenta lo siguiente

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

El typeofoperador en C # le dará un Typeobjeto para el tipo con nombre. Typelas instancias son comparables con el ==operador, por lo que este es un buen método para compararlas.

Nota: Si no recuerdo mal, hay algunos casos en que esto se rompe cuando los tipos involucrados son interfaces COM que están integradas en ensamblajes (a través de NoPIA). No parece que este sea el caso aquí.

JaredPar
fuente
75

Puedes usar para ello el is operador . Luego puede verificar si el objeto es de un tipo específico escribiendo:

if (myObject is string)
{
  DoSomething()
}
Rafal Spacjer
fuente
3
¿Es mejor para nosotros "es" o "tipo de"?
Brent Waggoner
32

Puede comparar exactamente el mismo tipo usando:

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

typeof devuelve el objeto Type de una clase dada.

Pero si tiene un tipo B, que hereda de A, entonces esta comparación es falsa. Y estás buscando IsAssignableFrom .

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

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

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

Si su instancia es un Type:

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

pero si su instancia es objecty no Typeutiliza el asoperador:

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

Esto tiene la ventaja de convertir valuesolo una vez en el tipo especificado.

Syntony
fuente