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 ) |
- 你的例子和你的问题在一起没有意义。您说您只希望在继承类型时返回true,但随后显示继承的比较应返回false。
- 我想你的意思是,你只想在完全相同的类型(不是继承的)时返回true。否则代码中的注释是错误的。
- 在最初的例子中,他想要:b.GetType() == typeof(A),因为没有声明"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 )) // this returns false |
您的代码示例似乎与您的问题相反。
1 2
| bool isExactTypeOrInherited = b is A ;
bool isExactType = b .GetType() == a .GetType(); |
- 你的意思是第二行的typeof(a),而不是a.getType(),是吗?
- 我的意思是在第一行有一个大A当然是:->…F1X0RD
1 2 3
| bool IsSameType(object o, Type t) {
return o.GetType() == t;
} |
然后您可以这样调用方法:
- 这不管用。对于两个不同的类型,使用相同的全名,但使用不同的类型是完全合法的——虽然很少见,但也是合法的。为什么不将o.gettype()与t进行比较,而不是遍历名称呢?(如果您遇到两个具有相同全名的类型的不幸情况,并且需要在同一程序集中使用它们,则可以使用导入的程序集别名将它们区分开来。)