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

问题描述 投票:4回答:4

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

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

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

以及派生自它的类:

public MyDerivedClass : MyBaseClass { }

然后我打电话给:

MyDerivedClass.MyBaseClassStaticMethod()

在方法MyBaseClassStaticMethod中,可以知道哪个是调用者派生类型? (即MyDerivedClass

我只需要一根绳子......

c# reflection derived-class
4个回答
5
投票

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

更新:

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


6
投票

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

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

0
投票

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

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

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


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

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.