c#检查确切类型

c# check for exact type

本问题已经有最佳答案,请猛点这里访问。

我要检查对象的类型。如果类型完全相同,我只想返回true。继承的类应返回false。

如:

1
2
3
4
5
6
7
8
class A {}
class B : A {}

B b = new B();

// The next line will return true,
// but I am looking for an expression that returns false here
if(b is A)


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


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

另一方面,b.GetType() == typeof(A)检查的是完全相同的类型。如果您不进一步限定类型(即强制转换),那么您将检查声明的B类型。

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

请注意,为什么要在一种情况下使用确切的类型而不在另一种情况下使用:

  • 例如,检查准确的类型会破坏OO多态性的目的,而您可能最终不希望这样做。
  • 但是,例如,如果您正在实现一个专门的软件设计模式,比如反转控制IOC容器,那么您有时会希望使用精确的类型。

编辑:

在你的例子中,

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

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

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


用途:

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

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

1
2
bool isExactTypeOrInherited = b is A;
bool isExactType = b.GetType() == a.GetType();


1
2
3
bool IsSameType(object o, Type t) {
  return o.GetType() == t;
}

然后您可以这样调用方法:

1
IsSameType(b, typeof(A));