2012-04-02 43 views
5

子I型有三类:ClassAClassBClassCgetType()返回在父类的构造

ClassC延伸ClassB继而延伸ClassA

当我从ClassA的构造函数调用GetType()时,.net返回ClassC的类型。我很困惑,因为这发生在已经工作了一段时间并且我一段时间没有碰到的代码中。有.net修补程序改变了GetType()的行为吗?我不信。我唯一的想法是,这与我使用的测试框架xUnit有什么关系?

+0

所有之一 - 谢谢!每个人似乎都在说同样的事情......这是按照预期和一如既往的方式工作的。 – SFun28 2012-04-02 17:43:35

回答

12

它的行为完全按照它的设想。 GetType()返回对象实例的实际类型,即使它是一个子类(它总是有表现这种方式)。另一方面typeof(ClassA)总会给你ClassA的类型。

+0

奇怪......我不确定我的单元测试会如何通过。无论如何,似乎我应该使用typeof() – SFun28 2012-04-02 17:41:20

2

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

某处在你的代码有一个初始化像下面:

ClassA a = new ClassC()

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

GetType()返回一个real对象类型而不是实际的包装类型。

1

就我所知,GetType()总是返回实例的类型,而不是基类,不管它在哪里被调用。

2

GetType函数的行为与预期的一样。它应该总是返回值的实际运行时类型。我不相信任何热门补丁已经改变了这种行为,但你现在看到的行为是无可争辩的。

如果你想看到的声明类型的方法,而不是然后使用以下

typeof(TheContainingType) 
MethodBase.GetCurrentMethod().DeclaringType