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

标签 c# reflection types

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

u is User -> returns true

u is t -> compilation error

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

最佳答案

其他答案均有重大遗漏。

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 animal

如果这不是您想要的,那么您可能需要 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 

关于c# - 如何检查变量的类型是否与存储在变量中的类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10415276/

相关文章:

c# - 创建 Word 文档并从 .NET 应用程序添加图像

c# - 从另一个进程接收消息

c# - C# 中 iPad 和 IIS 之间的 TCP/IP 连接

c# - 如何附加到 Visual Studio Code 中的特定进程

javascript - 获取变量名。 javascript "reflection"

java - 如何在不知道属性类型的情况下设置属性(即通过 BeanUtils)

reflection - 从 Golang 类型中提取未导出字段的正确方法是什么?

postgresql - 将单独的年、月、日、小时、分钟和秒列集成为单个时间戳列

C# 类类型转换

types - 在 common-lisp 中,类型之间的关系是如何定义的?