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

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

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

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

以及派生自它的类:

 public MyDerivedClass : MyBaseClass { } 

然后我打电话给:

 MyDerivedClass.MyBaseClassStaticMethod() 

在方法MyBaseClassStaticMethod ,是否有可能知道哪个是调用者派生类型
(即MyDerivedClass

我只需要一个字符串……

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

更新:

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

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

 public class BaseClass where TDerived : BaseClass { public static void LogCallerType() { Console.WriteLine(typeof(TDerived).Name); } } public class FooClass : BaseClass { } public class BooClass : BaseClass { } class Program { static void Main(string[] args) { FooClass.LogCallerType(); BooClass.LogCallerType(); } } 

这将依次输出以下内容

 1. FooClass 2. BooClass 

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

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

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

首先,静态方法无法访问调用它的实例。 静态方法与普通类方法的不同之处在于它不能访问类实例的“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) ... ... }