如何从基类访问私有阴影常量
本文关键字:有阴影 常量 访问 基类 | 更新日期: 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();
也就是说,这是一个非常糟糕的主意。考虑使用属性来关联元数据,而不是使用反射来访问私有常量。