GetType() 在超类构造函数中返回子类类型

本文关键字:返回 子类 类型 构造函数 超类 GetType | 更新日期: 2023-09-27 18:29:50

我有三个类:ClassAClassBClassC

ClassC扩展ClassB进而扩展ClassA

当我从ClassA的构造函数调用 GetType(( 时,.net 返回ClassC的类型。 我很困惑,因为这发生在已经工作了一段时间并且我已经有一段时间没有接触的代码中。 是否有针对 .net 的修补程序更改了 GetType(( 的行为? 我对此表示怀疑。 我唯一的另一个想法是这与我正在使用的测试框架xUnit有关?

GetType() 在超类构造函数中返回子类类型

它的行为完全符合预期。 GetType()返回对象实例的实际类型,即使它是一个子类(并且它一直以这种方式运行(。 另一方面,typeof(ClassA)总是会给你 ClassA的类型 .

如果我正确理解你的问题,你有一个ClassA a类型,通过调用它你会得到ClassC.如果是这样,它很可能不是一个真正的ClassA对象,但它是这样的:

在代码中的某个地方,您有一个初始化,如下所示:

ClassA a = new ClassC() .

考虑到ClassC : ClassBClassB : ClassA你可以做到这一点。

GetType()返回实际对象类型,而不是实际包装器类型。

GetType 函数的行为符合预期。 它应始终返回值的实际运行时类型。 我不相信任何热补丁改变了这种行为,但你现在看到的行为是绝对正确的。

如果要查看方法的声明类型,请使用以下方法之一

typeof(TheContainingType)
MethodBase.GetCurrentMethod().DeclaringType

据我所知,GetType(( 始终返回实例的类型,而不是基类,无论它在哪里调用。