User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
¿Cómo pruebo si alguna variable es de algún tipo de esta manera?
Respuestas:
Todas las otras respuestas contienen omisiones significativas.
El is
operador no comprueba si el tipo de tiempo de ejecución del operando es exactamente el tipo dado; más bien, comprueba si el tipo de tiempo de ejecución es compatible con el 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 verificación de la identidad del tipo con la reflexión comprueba la identidad , no la compatibilidad
bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal
or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an
Si eso no es lo que desea, probablemente desee IsAssignableFrom:
bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A
t
a typeof(Animal)
. Entonces la forma mejorada de Mark se convierte en t.IsInstanceOfType(x)
.
GetType()
existe en cada tipo de marco, porque está definido en la base object
tipo . Entonces, independientemente del tipo en sí, puede usarlo para devolver el subyacenteType
Entonces, todo lo que necesitas hacer es:
u.GetType() == t
Necesita ver si el Tipo de su instancia es igual al Tipo de la clase. Para obtener el tipo de instancia, usa el GetType()
método:
u.GetType().Equals(t);
o
u.GetType.Equals(typeof(User));
Deberías hacerlo. Obviamente, podría usar '==' para hacer su comparación si lo prefiere.
u.GetType.Equals(typeof(User));
t
que contiene el tipo.
Para comprobar si un objeto es compatible con una variable de tipo determinada, en lugar de escribir
u is t
Deberías escribir
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
es más corto y sencillo quetypeof(Animal).IsAssignableFrom(x.GetType());
(y Resharper sugerirá usar el primero si usa el segundo).