为什么Object.GetType()不是虚拟的?

从MSDN获取的代码示例

public class Test { public static void Main() { MyBaseClass myBase = new MyBaseClass(); MyDerivedClass myDerived = new MyDerivedClass(); object o = myDerived; MyBaseClass b = myDerived; Console.WriteLine("mybase: Type is {0}", myBase.GetType()); Console.WriteLine("myDerived: Type is {0}", myDerived.GetType()); Console.WriteLine("object o = myDerived: Type is {0}", o.GetType()); Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType()); }} /* This code produces the following output. mybase: Type is MyBaseClass myDerived: Type is MyDerivedClass object o = myDerived: Type is MyDerivedClass MyBaseClass b = myDerived: Type is MyDerivedClass */ 

那么使GetType()虚拟至少它是虚拟的是合乎逻辑的吗? 任何人都可以解释一下吗? 和其他问题.NET框架中的任何其他方法都有类似GetType的行为?

因为.Net框架不希望您覆盖GetType()方法和spoof类型。

假设您可以覆盖该方法除了返回实例的类型之外还希望它做什么。 当你为每个类重写方法以返回实例的类型时,你不会违反DRY。

GetType返回对象的实际类型。 这使我们可以知道我们真正传递给’我们’函数的对象。 框架的许多方法都需要这个来确定它们自己的function – 在大多数情况下需要获取此类的属性。 如果框架将失去确定对象的实际类型的可能性,则该对象也将松散此类型

如果您想知道方法范围中使用的类型 – 您声明的类型或编译器选择的类型 – 您可以添加一个非常简单的扩展方法:

 public static Type GetCurrentType(this T obj) { return typeof(T); } public static void Main() { MyBaseClass myBase = new MyBaseClass(); MyDerivedClass myDerived = new MyDerivedClass(); object o = myDerived; MyBaseClass b = myDerived; Console.WriteLine("mybase: Type is {0}", myBase.GetCurrentType()); Console.WriteLine("myDerived: Type is {0}", myDerived.GetCurrentType()); Console.WriteLine("object o = myDerived: Type is {0}", o.GetCurrentType()); Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetCurrentType()); } /* This code produces the following output. mybase: Type is ValidatorTest.MyBaseClass myDerived: Type is ValidatorTest.MyDerivedClass object o = myDerived: Type is System.Object MyBaseClass b = myDerived: Type is ValidatorTest.MyBaseClass */ 

如果GetType()是虚拟的,名为HumanBeing的类可以覆盖它并返回一个表示Robot的Type对象,称为欺骗并防止这是CLR的一个主要特性,称为Type Safety。

虽然你无法覆盖object.GetType()方法,但你可以使用“new”来完全重载它,从而欺骗另一种已知类型。 这很有趣,但是,我还没有想出如何从头开始创建“Type”对象的实例,所以下面的例子假装是另一种类型。

 public class NotAString { private string m_RealString = string.Empty; public new Type GetType() { return m_RealString.GetType(); } } 

在创建了这个实例之后,(new NotAstring())。GetType()确实会返回字符串的类型。

修改Dr Snooze的答案 ,以便“从头开始创建”Type“对象的实例”:

 public class NotAString { public new Type GetType() { return typeof(string); } }