c#检查确切类型[重复]
Posted
技术标签:
【中文标题】c#检查确切类型[重复]【英文标题】:c# check for exact type [duplicate] 【发布时间】:2011-01-10 22:02:48 【问题描述】:我想检查一个对象的类型。如果类型完全相同,我只想返回 true。继承的类应该返回 false。
例如:
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。否则你代码中的注释是错误的。 【参考方案1】:b.GetType() == typeof(A)
【讨论】:
在原始示例中,他想要:b.GetType() == typeof(A)
,因为未声明“a”。
这就是我发布答案的原因,一分钟后。【参考方案2】:
(b is A)
检查 b 与 A 的类型兼容性,这意味着它检查 b 的继承层次结构和类型 A 的实现接口。
b.GetType() == typeof(A)
检查 exact 相同的类型。如果您没有进一步限定类型(即强制转换),那么您正在检查 b 的声明类型。
在任何一种情况下(使用上述任何一种),如果 b 是 A 的确切类型,您都会得到 true
。
请注意了解为什么要在一种情况下使用精确类型而不是另一种情况:
例如,检查确切的类型会违背 OO 多态性的目的,而您最终可能不希望这样做。 但是,例如,如果您要实现专门的软件设计模式(如控制反转 IoC 容器),那么您有时会希望使用精确类型。编辑:
在你的例子中,
if(b is A) // this should return false
使用以下方法将其转换为精确声明的类型检查:
if (b.GetType() == typeof(A))
【讨论】:
【参考方案3】:使用:
if (b.GetType() == typeof(A)) // this returns false
【讨论】:
【参考方案4】:您的代码示例似乎与您的问题相反。
bool isExactTypeOrInherited = b is A;
bool isExactType = b.GetType() == a.GetType();
【讨论】:
你的意思是第二行的typeof(a),不是a.GetType(),是吗? 我的意思当然是第一行的大 A :-> ... f1x0red【参考方案5】:bool IsSameType(object o, Type t)
return o.GetType() == t;
然后你可以这样调用方法:
IsSameType(b, typeof(A));
【讨论】:
这不起作用。两种不同的类型具有相同的全名但属于不同的类型是完全合法的——很少见,但也是合法的。为什么不将 o.GetType() 与 t 进行比较,而不是通过名称? (如果不幸的情况是两种类型的全名相同,并且需要在同一个程序集中使用它们,那么您可以使用导入的程序集别名来区分它们。)以上是关于c#检查确切类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章