c#检查确切类型

我想检查一个对象的类型。 如果类型完全相同,我只想返回true。 inheritance的类应该返回false。

例如:

class A {} class B : A {} B b = new B(); if(b is A) // this should return false 

 b.GetType() == typeof(A) 

(b is A)检查b是否与A类型兼容,这意味着它检查b的inheritance层次结构和类型A的已实现接口。

b.GetType() == typeof(A)另一方面检查完全相同的 Type。 如果你没有进一步限定类型(即铸造),那么你正在检查b的声明类型。

在任何一种情况下(使用上述任何一种),如果b是A的确切类型,你将得到true

要小心知道为什么要在一种情况下使用精确类型而不是另一种情况:

  • 例如,检查确切类型会破坏您可能不希望最终完成的OO多态性的目的。
  • 但是,例如,如果您正在实施一个专门的软件设计模式,如Inversion of Control IoC容器,那么您有时希望使用精确类型。

编辑:

在你的例子中,

 if(b is A) // this should return false 

使用以下方法将其转换为精确声明的类型检查

 if (b.GetType() == typeof(A)) 

使用:

 if (b.GetType() == typeof(A)) // this returns false 

您的代码示例似乎与您的问题相反。

 bool isExactTypeOrInherited = b is A; bool isExactType = b.GetType() == a.GetType(); 
 bool IsSameType(object o, Type t) { return o.GetType() == t; } 

然后你可以调用这样的方法:

 IsSameType(b, typeof(A)); 

请在询问新问题之前使用搜索function。

这个问题已经回答了:

检查类型是否为可转换/子类

并执行相反的操作 – 如果类型是子类,则返回false。

编辑:另一个相关的问题: 类型检查:typeof,GetType,还是?