4

I was wondering if it's possible (even via reflection et similia) to get the caller derived-class inside of a called base-class static method.

For example, I've a base-class with a static method defined:

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

and a derived-from-it class:

public MyDerivedClass : MyBaseClass { }

then I call:

MyDerivedClass.MyBaseClassStaticMethod()

Is it possibile, inside of method MyBaseClassStaticMethod, to know which is the caller derived type?
(i.e. MyDerivedClass)

I just need a string...

4

4 回答 4

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
于 2014-03-20T12:03:17.817 回答
5

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

更新:

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

于 2013-04-30T14:08:08.317 回答
0

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

但是,您可以 - 通过编译器技巧 - 从派生类访问静态成员。从MSDN 论坛上的这篇文章开始,来自派生类的静态成员访问被转换为来自包含静态成员的基类的调用。所以MyDerivedClass.MyBaseClassStaticMethod翻译为MyBaseClass.MyBaseClassStaticMethod. 因此MethodBase.GetCurrentMethod().DeclaringType总会回来MyBaseClass的。

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

于 2018-09-17T09:32:55.603 回答
-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)
        ...

    ...
}
于 2013-04-30T14:16:58.120 回答