调用基类静态方法时获取Caller派生类

时间:2013-04-30 14:05:28

标签: c# reflection derived-class

我想知道是否有可能(甚至通过reflection et similia)在被调用的基类静态方法中获取调用者派生类。

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

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

和派生自它的类:

public MyDerivedClass : MyBaseClass { }

然后我打电话给:

MyDerivedClass.MyBaseClassStaticMethod()

是否有可能在方法MyBaseClassStaticMethod内知道哪个是来电者派生类型
(即MyDerivedClass

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

4 个答案:

答案 0 :(得分:5)

不,这是不可能的 - 绝不是。 static方法不是多态的,因此这些信息根本不存在 考虑重新设计代码。

更新

编译后,编译器将MyDerivedClass替换为实际声明静态方法的类,在您的情况MyBaseClass中。 因此,即使在IL中,您也看不到MyDerivedClass。信息仅存在于源代码中 。它在编译的程序集中不存在。

答案 1 :(得分:5)

以下方式的泛型可用于解决您的场景

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

答案 2 :(得分:0)

静态方法静态绑定到特定类,并且实际上不参与继承链。因此,它在派生类中不存在。因此,静态方法不知道它实际在派生类中使用。

但是,您可以-通过编译技巧-从派生类访问静态成员。从this post on MSDN-forum开始,派生类的静态成员访问被转换为包含静态成员的基类的调用。因此MyDerivedClass.MyBaseClassStaticMethod被翻译成MyBaseClass.MyBaseClassStaticMethod。因此MethodBase.GetCurrentMethod().DeclaringType将始终返回MyBaseClass

所以简而言之:不,不可能从静态成员中获取派生类型。

答案 3 :(得分:-1)

首先,静态方法无法访问调用它的实例。静态方法与普通类方法的不同之处在于它不能访问类实例的“this”引用。

如果您将'this'作为参数传递给静态方法,那么您可以尝试按如下方式进行投射。假设您有许多要测试的派生类。

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)
        ...

    ...
}