如何从基类访问私有阴影常量

本文关键字:有阴影 常量 访问 基类 | 更新日期: 2023-09-27 18:19:28

这是代码:

void Main()
{
    Base.Title.Dump("Base");             // displays "Base Title"
    Child.Title.Dump("Child");           // displays "Base Title"
    Base baseClass = new Base();
    Base childClass = new Child();       // "InvalidOperationException" would be thrown
}
class Base {
    public const string Title = "Base Title";
    public string ClassTitle { get; set; }
    public Base() {
        Type type = this.GetType();
        type.GetFields()
            .First(item => item.Name == "Title")
            .GetValue(this).Dump();
    }
}
class Child : Base {
    private new const string Title = "Child Title";
}

在基构造函数中引发了"InvalidOperationException"异常。

如何从基类访问私有阴影常量

如果您想要派生类Title,您需要将子类的Title公开或者粗鲁地用这样的东西打开它的私人成员:

Console.WriteLine((type.GetFields(
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Static)
    .First(item => item.Name == "Title"))
    .GetValue(this));

如果你想要基类标题,那么你的行:

Type type = this.GetType();

正在获取派生类型,而您需要基类型。

试试这个:

Type type = typeof(Base);

如果不通过反射来访问它,就会发现它是有效的。

Title.Dump();

试试这个

(type.GetFields().First(item => item.Name == "Title")).GetValue(this);

根据MSDN,GetFields()默认情况下只返回公共字段。请尝试将重载与BindingFlags一起使用。

您需要使用指定私有静态字段的GetFields重载:

type.GetFields(BindingFlags.Static | BindingFlags.NonPublic)
            .First(item => item.Name == "Title")
            .GetValue(null).Dump();

也就是说,这是一个非常糟糕的主意。考虑使用属性来关联元数据,而不是使用反射来访问私有常量。