在继承类的构造函数中设置私有属性值

jba*_*all 1 c# inheritance

我有一个来自外部库的基类,我无法修改 - 这是相关的部分:

public class BaseClass
{
     List<string> _values;
     public Values { get { return _values; } }
}
Run Code Online (Sandbox Code Playgroud)

我继承BaseClass,我想将_values设置为一个继承自构造函数中的List(T)的类:

public InheritingClass : BaseClass
{
     public InheritingClass():base()
     {
          //set base._values = new InhertingList<string>(); ?
     }
}
Run Code Online (Sandbox Code Playgroud)

在那里设置base._values的最佳方法是什么?有没有办法找到值获取的私有变量,并设置以防将来重命名私有变量?

还有其他方法可以完成我需要做的事情,但是如果我可以做到以下几点,那么在没有设置私有属性值的情况下,实现目标的任何方式都会更快.

Ree*_*sey 7

根据定义,将其保密是为了防止出现这种情况.

最好的选择是实现受保护的setter:

public class BaseClass
{
     public Values { 
        get { return _values; }
        protected set { _values = value; }
     }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的InheritingClass可以访问setter,并且可以执行以下操作:

this.Values = new InhertingList<string>(); 
Run Code Online (Sandbox Code Playgroud)

但是,由于您无法更改基类,从技术上讲,可以通过反射(在完全信任场景中)来实现.不过,我不推荐这种方法:

FieldInfo field = typeof(BaseClass).GetField("_value", BindingFlags.Instance | BindingFlags.NonPublic );
field.SetValue(this, this.Values = new InhertingList<string>() );
Run Code Online (Sandbox Code Playgroud)

做你正在尝试的事情的危险,顺便说一下,你要将BaseClass定义的实现改为你提供的东西.因为你(有目的地)"打破"基类中的实现细节,所以很容易引入细微的错误.

我试着重新考虑你的算法,看看是否还有另一种解决这个问题的方法.