我有三个课程:ClassA
,ClassB
,ClassC
。
ClassC
扩展ClassB
,后者又扩展ClassA
。
当我从ClassA
的构造函数调用GetType()时,.net返回ClassC
的类型。我感到困惑,因为这种情况发生在已经工作了一段时间的代码中,而且我有一段时间没有碰过。是否有.net的修补程序改变了GetType()的行为?我不信。我唯一的另一个想法是,这与我正在使用的测试框架xUnit有关吗?
答案 0 :(得分:12)
它的行为完全符合预期。 GetType()
返回对象实例的实际类型,即使它是一个子类(并且总是以这种方式运行)。另一方面,typeof(ClassA)
总是会为您提供ClassA
的类型。
答案 1 :(得分:2)
如果我理解你的问题,你有一个ClassA a
类型,通过调用它,你得到ClassC
。如果是这样,最可能的不是真正的 ClassA
对象,但它是这样的:
在代码中的某处,您进行了如下的初始化:
ClassA a = new ClassC()
。
考虑到可以 <{1}}和ClassC : ClassB
。
ClassB : ClassA
返回真实的对象类型,而不是实际的包装器类型。
答案 2 :(得分:2)
GetType
函数的行为符合预期。它应该始终返回值的实际运行时类型。我不相信任何热补丁已经改变了这种行为,但你现在看到的行为肯定是正确的。
如果要查看方法的声明类型,请使用以下
之一typeof(TheContainingType)
MethodBase.GetCurrentMethod().DeclaringType
答案 3 :(得分:1)
据我所知,GetType()总是返回实例的类型,而不是基类,无论它在何处被调用。