调用基类静态方法时获取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) ... ... }