2011-03-30 20 views
92

Pregunta rápida: cómo comparar un tipo tipo (juego de palabras no intencionado) con otro tipo en C#? Quiero decir, tengo un Type typeField y quiero saber si es System.String, System.DateTime, etc., pero typeField.Equals(System.String) no funciona.Cómo comparar tipos

¿Alguna pista?

Respuesta

135

Pruebe lo siguiente

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

El operador typeof en C# le dará un objeto Type para el tipo con nombre. Type instancias son comparables con el operador == por lo que este es un buen método para compararlos.

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

+0

¡Gracias por su ayuda útil! :) – Archedius

25

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 usted está buscando IsAssignableFrom.

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

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

if (typeof(A).IsAssignableFrom(typeOfb)) { // true 
} 
53

se puede utilizar para que el isoperator. A continuación, puede comprobar si el objeto es tipo específico por escrito:

if (myObject is string) 
{ 
    DoSomething() 
} 
+1

¿Es mejor para nosotros "is" o "typeof"? –

+6

Pero esta es para instancia de objeto ¿no? No para un 'Tipo' ... – 5argon

+1

sí, es por ejemplo de un tipo –

2

Si la instancia es un Type:

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

pero si la instancia es un object y no un Type uso, el usuario as:

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 value solo una vez en el tipo especificado.