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