我想知道是否有可能(甚至通过reflection et similia)在被调用的基类静态方法中获取调用者派生类。
例如,我有一个定义了静态方法的基类:
public MyBaseClass {
public static void MyBaseClassStaticMethod() { /** ... **/ }
}
以及派生自它的类:
public MyDerivedClass : MyBaseClass { }
然后我打电话给:
MyDerivedClass.MyBaseClassStaticMethod()
在方法MyBaseClassStaticMethod
中,可以知道哪个是调用者派生类型?
(即MyDerivedClass
)
我只需要一根绳子......
不,这是不可能的 - 绝不是。 static
方法不是多态的,因此这些信息根本就不存在。
考虑重新设计代码。
更新:
在编译时,编译器将MyDerivedClass
替换为实际声明静态方法的类,在您的情况下为MyBaseClass
。
所以即使在IL你也看不到MyDerivedClass
。该信息仅存在于您的源代码中。它在编译的程序集中不存在。
以下方式的泛型可用于解决您的方案
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
静态方法静态绑定到某个类,并不真正参与继承链。因此它在派生类中不存在。因此,静态方法不知道它实际上是在派生类中使用的。
但是,您可以 - 通过编译器技巧 - 从派生类访问静态成员。从this post on MSDN-forum开始,派生类的静态成员访问被转换为来自包含静态成员的基类的调用。所以MyDerivedClass.MyBaseClassStaticMethod
被翻译成MyBaseClass.MyBaseClassStaticMethod
。因此,MethodBase.GetCurrentMethod().DeclaringType
将总是返回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)
...
...
}