如何获取类在.NET中输入基类静态方法?

时间:2011-01-12 13:11:59

标签: c# .net reflection inheritance

我想要做的就是:

public abstract class BaseClass
{
    public static Type GetType()
    {
        return typeof(BaseClass);
    }
}

但是当我推导它时

public class DerivedClass : BaseClass
{
}

我想要

Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType());

如何更改BaseClass以使此断言成立?

2 个答案:

答案 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()