返回当前类的静态方法'名称,无论继承

时间:2017-06-03 14:34:36

标签: c#

我的问题是MethodBase.GetCurrentMethod().DeclaringType.Name仅在类的实例上调用时才有效。如果从静态函数调用,它将返回最顶层的父类'无论其被分类多少次都会命名。

例如

public class ReflectionObject {

    public static string Name() {
        return MethodBase.GetCurrentMethod().DeclaringType.Name;
    }
}
public class DerivedObject : ReflectionObject {
}

调用DerivedObject.Name()会返回ReflectionObject而非DerivedObject,就像我需要它一样。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

静态继承不像普通方法的继承那样工作。您观察到的行为恰好发生(它充当父类的方法,而不是子类的方法)。用户Daniel Earwickerthis回答中说得非常好。简而言之,静态方法与其声明类型相关联。

现在,关于您的具体问题,没有办法让您尝试做的工作。然而,有一些替代方法可以实现您想要的结果。最简单的方法是使用属性而不是方法。

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)

这是不可能的,因为静态方法绑定到您声明它的类。您不能将其标记为虚拟或覆盖它。

如果需要名称,可以将基本静态方法视为辅助函数,并从派生类中传入名称。