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
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).t
atypeof(Animal)
. Entonces la forma mejorada de Mark se convierte ent.IsInstanceOfType(x)
.GetType()
existe en cada tipo de marco, porque está definido en la baseobject
tipo . Entonces, independientemente del tipo en sí, puede usarlo para devolver el subyacenteType
Entonces, todo lo que necesitas hacer es:
fuente
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:o
Deberías hacerlo. Obviamente, podría usar '==' para hacer su comparación si lo prefiere.
fuente
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
Deberías escribir
fuente