我想要做的就是:
public abstract class BaseClass
{
public static Type GetType()
{
return typeof(BaseClass);
}
}
但是当我推导它时
public class DerivedClass : BaseClass
{
}
我想要
Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType());
如何更改BaseClass以使此断言成立?
答案 0 :(得分:2)
你不能这样做,因为从它的一个基础到你的基础的唯一路由来自一个实例 - 静态方法不接受实例。
我希望您的示例是为了简单,否则重新实现GetType()似乎有点无意义 - 因为object.GetType()
将完全按照您的意愿执行。
如果您确实需要通过静态调用方法执行此操作 - 您不能这样做,因为静态方法实际上没有类型信息可用(正如我在第一段中所述)。
如果您实际通过实例调用此方法(但我必须问为什么!?),那么您可以执行以下操作之一
a)使您的方法成为基础上的实例方法。然后它可以执行this.GetType()
(使用.Net基本方法),它将返回实例的最终子类型。
b)为BaseClass
定义一个非常相似的扩展方法:
public static Type GetType2(this BaseClass instance)
{
return instance.GetType();
}
答案 1 :(得分:2)
不继承静态方法。
当通过其派生类之一调用基类的静态方法时,编译器将BaseClass
替换为DerivedClass
。例如,这是调用DerivedClass.GetType()
的IL代码:
IL_0002: call class [mscorlib]System.Type Tests.Program/BaseClass::GetType()