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


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

u is User -> returns true

u is t -> compilation error

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

Answers:


194

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

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 

4
尽管此处显示的最终方法可行,但它却很冗长。typeof(Animal).IsInstanceOfType(x)typeof(Animal).IsAssignableFrom(x.GetType());(更短,更直接)(Resharper将建议使用前者,建议使用后者)。
马克·阿默里

澄清:回答原来的问题,替代ttypeof(Animal)。因此,马克的改进形式变为t.IsInstanceOfType(x)
制造商史蒂夫(Steve)

13

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

因此,您所需要做的就是:

u.GetType() == t

1
实际上,埃里克(Eric)的回答对所有问题都有帮助,但并没有回答实际问题,即如何以原始问题中描述的“ u is t”方式来测试未知类型,而您的答案却是正确的。
丹尼尔(Daniel)

@Daniel-不完全是。仅当您要排除 t的子类时,Dave的答案才是正确的。埃里克(Eric)的回答主要说明了该怎么做。它只是缺少对在哪里放置“ t”的澄清。我将在此处添加评论。
制造商

10

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

 u.GetType().Equals(t);

要么

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

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


+1但喜欢第二个选择。u.GetType.Equals(typeof(User));
Omar

与使用==相比,此方法不安全的原因之一是,如果GetType()以某种方式返回null-它将抛出。
戴夫·比什

1
@Fuex,是的,我想,如果typeof是内联的,它使代码更易于阅读,这就是为什么我这样发布它,即使在OPs示例中他已经有一个t包含类型的变量了。
山姆·霍尔德

@DaveBish如果GetType返回null,那么我担心很多事情会开始抛出……但是,要点,你当然是对的
Sam Holder

@SamHolder是的-唯一会发生这种情况,就是有人重写基本类型,并以某种方式破坏了实现。肯定会很奇怪。
Dave Bish 2012年

4

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

u is t

你应该写

typeof(t).IsInstanceOfType(u)

1
与“ u is t”语法相比,更冗长的语法有什么好处?
凯尔·亨菲尔德

@KyleHumfeld如果您输入的是foo类型;对象A;您不能写“ A is foo”,但可以写foo.isInstanceOfType(A)
Timur Nuriyasov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.