Answers:
其他答案都包含重大遗漏。
在is
操作者不检查操作的运行时类型是完全相同给定的类型; 而是检查运行时类型是否与给定类型兼容:
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.
但是用反射检查类型身份会检查身份,而不是兼容性
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
如果那不是您想要的,那么您可能想要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
了typeof(Animal)
。因此,马克的改进形式变为t.IsInstanceOfType(x)
。
GetType()
存在于每个单一框架类型上,因为它是在基本object
类型上定义的。因此,无论类型本身如何,都可以使用它返回基础Type
因此,您所需要做的就是:
u.GetType() == t
您需要查看您的实例的类型是否等于类的类型。要获取实例的类型,请使用GetType()
方法:
u.GetType().Equals(t);
要么
u.GetType.Equals(typeof(User));
应该这样做。显然,如果愿意,可以使用'=='进行比较。
u.GetType.Equals(typeof(User));
t
包含类型的变量了。
为了检查对象是否与给定的类型变量兼容,而不是编写
u is t
你应该写
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
比typeof(Animal).IsAssignableFrom(x.GetType());
(更短,更直接)(Resharper将建议使用前者,建议使用后者)。