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#检查确切类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c#检查“*”是不是在字符串中重复[重复]

检查集合c#中是不是存在元素

检查 JSON 中的重复属性

如何在c#中检查对象是不是没有空属性[重复]

如何在C#中检查我的互联网是不是超时[重复]

C# 中的正则表达式无法正常工作以进行数字检查 [重复]