获取主叫派生类调用基类的静态方法时(Get Caller derived-class when ca

2019-09-01 11:57发布

我在想,如果有可能(甚至通过反射等similia)获得致电派生类被称为基类的静态方法的内部。

例如,我有个基类与定义的静态方法:

public MyBaseClass {
    public static void MyBaseClassStaticMethod() { /** ... **/ }
}

和派生从-它类:

public MyDerivedClass : MyBaseClass { }

然后我打电话:

MyDerivedClass.MyBaseClassStaticMethod()

它是不可能性,方法里面MyBaseClassStaticMethod ,要知道这是主叫派生类型
(即MyDerivedClass

我只是需要一个字符串...

Answer 1:

不,这是不可能的 - 决不。 static方法不polymorphal因此这样的信息根本不存在。
考虑重新设计你的代码。

更新:

在编译时,编译器替换MyDerivedClass用静态方法实际上是宣布对班,你的情况MyBaseClass
因此,即使在IL看不到MyDerivedClass存在于你的源代码的信息。 它不会在你的编译的程序集存在。



Answer 2:

在下面的泛型方法可以用来解决您的方案

public class BaseClass<TDerived> where TDerived : BaseClass<TDerived>
{
    public static void LogCallerType()
    {
        Console.WriteLine(typeof(TDerived).Name);
    }
}

public class FooClass : BaseClass<FooClass> { }

public class BooClass : BaseClass<BooClass> { }

class Program
{
    static void Main(string[] args)
    {
        FooClass.LogCallerType();
        BooClass.LogCallerType();
    }
}

这反过来将输出以下

1. FooClass
2. BooClass


Answer 3:

静态方法是静态绑定到某一类并没有真正参与到继承链。 因此,它不会在派生类中存在。 静态方法为此不知道它是在派生类中实际使用。

但是,您可以 - 通过编译器把戏 - 从你的派生类访问静态成员。 由于这个职位上MSDN论坛从派生类的静态成员访问被转换为从含有静态成员的基类的呼叫。 所以MyDerivedClass.MyBaseClassStaticMethod被翻译成MyBaseClass.MyBaseClassStaticMethod 。 因此MethodBase.GetCurrentMethod().DeclaringType将返回百达MyBaseClass

因此,在短期: 没有,it's不可能得到从一个静态成员的派生型。



Answer 4:

首先,静态方法将不能访问到被调用它的实例。 静态方法是从在于其不具有访问“这个”参考一个类的实例一个普通的类方法不同。

如果你通过了“这个”作为参数传递给静态方法,那么你可以尝试铸造它,如下所示。 假设你有多个派生类的,你想测试。

public static void MyBaseClassStaticMethod(MyBaseClass callingInstance)
{
    MyDerivedClass myDerivedClass = callingInstance as MyDerivedClass;
    MyDerivedClass2 myDerivedClass2 = callingInstance as MyDerivedClass2;
    MyDerivedClass3 myDerivedClass3 = callingInstance as MyDefivedClass3;
    ...

    // test for which derived class is calling
    if (myDerivedClass != null)
        ...
    else if (myDerivedClass2 != null)
        ...

    ...
}


文章来源: Get Caller derived-class when calling a base-class static method