在下面我想调用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{ }
答案 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的定义。