2012-05-02 24 views

Respuesta

153

Las demás respuestas contienen omisiones importantes.

El operador is hace no de verificación si el tipo de ejecución del operando es exactamente tipo dado; más bien, se comprueba si el tipo de tiempo de ejecución es compatible con tipo dado:

class Animal {} 
class Tiger : Animal {} 
... 
object x = new Tiger(); 
bool b1 = x is Tiger; // true 
bool b2 = x is Animal; // true also! Every tiger is an animal. 

Pero la comprobación de tipo identidad con cheques de reflexión para identidad, no para compatibilidad

bool b3 = x.GetType() == typeof(Tiger); // true 
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal 

Si eso no es lo que quiere, entonces es probable que desee IsAssignableFrom:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true 
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger. 
+1

Si bien el enfoque final que se muestra aquí funciona, es innecesariamente detallado. 'typeof (Animal) .IsInstanceOfType (x)' es más corto y más directo que 'typeof (Animal) .IsAssignableFrom (x.GetType());' (y Resharper sugerirá usar el primero si usa el último). –

11

GetType() existe en cada tipo de marco de trabajo, porque está definido en el tipo de base object. Por lo tanto, independientemente del tipo en sí, que se puede utilizar para devolver el subyacente Type

Por lo tanto, todo lo que tiene que hacer es:

u.GetType() == t 
+9

respuesta de Eric a continuación es mucho mejor - por favor leer. –

+1

En realidad, la respuesta de Eric es útil y todo, pero no responde la pregunta real de cómo probar con un tipo desconocido en la forma "u is t" descrita en la pregunta original, y la tuya sí. – Daniel

7

necesita ver si el tipo de la instancia es igual a el tipo de la clase Para obtener el tipo de la instancia que utiliza el método de GetType():

u.GetType().Equals(t); 

o

u.GetType.Equals(typeof(User)); 

debe hacerlo. Obviamente, podría usar '==' para hacer su comparación, si lo prefiere.

+0

+1 Pero prefiero la segunda elección. 'u.GetType.Equals (typeof (User));' –

+0

Una razón por la que esto es menos seguro que usar == - es que si GetType() de alguna manera devuelve null, se lanzará. –

+1

@Fuex, sí, creo que hace que el código sea más fácil de leer si el typeof está en línea, por lo que lo publiqué de esa manera, aunque en el ejemplo de OP ya tiene una 't' variable que contiene el tipo . –

4

el fin de comprobar si un objeto es compatible con una variable de tipo dado, en lugar de escribir

u is t 

debe escribir

typeof(t).IsInstanceOfType(u) 
+1

¿Cuál es el beneficio de la sintaxis más detallada frente a la sintaxis 'u is t'? –

+0

@KyleHumfeld Si tuvieras Type foo; Objeto A; no puede escribir "A is foo", pero puede escribir foo.isInstanceOfType (A) –

Cuestiones relacionadas