我的问题是MethodBase.GetCurrentMethod().DeclaringType.Name
仅在类的实例上调用时才有效。如果从静态函数调用,它将返回最顶层的父类'无论其被分类多少次都会命名。
例如
public class ReflectionObject {
public static string Name() {
return MethodBase.GetCurrentMethod().DeclaringType.Name;
}
}
public class DerivedObject : ReflectionObject {
}
调用DerivedObject.Name()
会返回ReflectionObject
而非DerivedObject
,就像我需要它一样。有什么想法吗?
答案 0 :(得分:1)
静态继承不像普通方法的继承那样工作。您观察到的行为恰好发生(它充当父类的方法,而不是子类的方法)。用户Daniel Earwicker在this回答中说得非常好。简而言之,静态方法与其声明类型相关联。
现在,关于您的具体问题,没有办法让您尝试做的工作。然而,有一些替代方法可以实现您想要的结果。最简单的方法是使用属性而不是方法。
public class ReflectionObject
{
public string Name
{
get {
return this.GetType().Name;
}
}
}
然后,如果您的子类中有这样的方法:
public class DerivedObject : ReflectionObject
{
public string MyName()
{
return this.Name;
}
}
..调用new DerivedObject().MyName()
之类的内容会返回"DerivedObject"
,这是您想要的结果。在属性中使用它而不是GetType()
也是一个选项:
MethodBase.GetCurrentMethod().DeclaringType.Name;
当然,由于您没有提及您的用例,我不知道您可能有任何限制。通常,这是获取子类名称的最简单方法。
答案 1 :(得分:1)
这是不可能的,因为静态方法绑定到您声明它的类。您不能将其标记为虚拟或覆盖它。
如果需要名称,可以将基本静态方法视为辅助函数,并从派生类中传入名称。