如何在基类中执行静态方法时获取派生类的类名?

时间:2010-02-19 10:23:19

标签: c# .net

在下面我想调用MyOtherClass.MyStaticMethod()来输出“MyOtherClass”,这可能吗?我目前的所有尝试都给了我“MyClass”。

我遇到的问题是我无法轻易更改MyOtherClass,因为有100个类从MyClass扩展。

public class MyClass
{
    public static string MyStaticMethod()
    {
        string className = typeof(MyClass).Name;
        Console.WriteLine(className);
    }
}
public class MyOtherClass : MyClass{ }

4 个答案:

答案 0 :(得分:1)

你不需要它作为实例方法,然后调用

string className = typeof(this).Name;

答案 1 :(得分:1)

在C#和Java中,你可以重载一个静态方法,但不能覆盖它。也就是说,静态方法上的多态和继承不存在。 (有关详细信息,请参阅this question

静态方法没有this的概念,因此,您无法以多态方式获取类型。这意味着您需要为每个类定义一个静态方法,以打印正确的类型。

答案 2 :(得分:1)

这与我上周刚问过的一个问题有关:C# static member “inheritance” - why does this exist at all?

要切入追逐, C#并不真正支持静态方法继承 - 所以,你不能按照你的要求去做。不幸的是,有可能写MyOtherClass.MyStaticMethod() - 但这并不意味着有任何真正的继承:在这个范围内,这只是范围规则非常宽松。

编辑虽然您无法直接执行此操作,但您可以执行C ++程序员调用Curiously Recurring Template Pattern并使用generics [1]

public class MyClass<TDerived> where TDerived:MyClass<TDerived> {
    public static string MyStaticMethod() { return  typeof(TDerived).Name; }
}
public class MyOtherClass : MyClass<MyOtherClass> { }
public class HmmClass:MyOtherClass { }

void Main() {
    MyOtherClass.MyStaticMethod().Dump(); //linqpad says MyOtherClass
    HmmClass.MyStaticMethod().Dump();  //linqpad also says MyOtherClass
}

在这里,您需要更新子类 - 但只是以较小的方式。

答案 3 :(得分:0)

从.NET框架的3.5版开始,您可以使用扩展函数来检索有关该类实例的信息。

public static class MyClassExtensions {
  public static string Name(this MyClass instance) {
    return typeof(instance).Name;
  }
}

提供实例方法而不修改MyOtherClass的定义。