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?

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í.


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()
}

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
}

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.