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

u is User -> returns true

u is t -> compilation error

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

4

4 回答 4

209

其他答案均存在重大遗漏。

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 
于 2012-05-02T14:51:39.820 回答
15

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

所以,你需要做的就是:

u.GetType() == t
于 2012-05-02T13:59:30.937 回答
11

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

 u.GetType().Equals(t);

或者

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

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

于 2012-05-02T14:00:03.650 回答
4

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

u is t

你应该写

typeof(t).IsInstanceOfType(u)
于 2015-08-05T14:39:55.047 回答