如何检查变量的类型是否与存储在变量中的类型匹配

时间:2012-05-02 13:58:20

标签: c# reflection types

User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

如何通过这种方式测试某个变量是否属于某种类型?

4 个答案:

答案 0 :(得分:179)

其他答案都包含重大遗漏。

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 b3 = x.GetType() == typeof(Tiger); // true
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal

如果那不是你想要的,那么你可能想要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 :(得分:13)

每个框架类型都存在

GetType(),因为它是在基础object类型上定义的。因此,无论类型本身如何,您都可以使用它来返回基础Type

所以,你需要做的就是:

u.GetType() == t

答案 2 :(得分:9)

您需要查看实例的类型是否等于类的类型。要获取实例的类型,请使用GetType()方法:

 u.GetType().Equals(t);

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

应该这样做。显然,如果您愿意,可以使用'=='进行比较。

答案 3 :(得分:4)

为了检查对象是否与给定的类型变量兼容,而不是写

u is t

你应该写

typeof(t).IsInstanceOfType(u)