如何设置没有setter的属性值

Luk*_*Feo 6 c# reflection properties automatic-properties

我已经看到了各种问题并回答了我们可以使用这样的反射来调用私有的setter:

是否有可能通过反思得到一个房产的私人制定者?

但是我有一些代码,它有一个我需要设置的属性但不能因为没有setter,我不能添加一个setter,因为这不是我的代码.在这种情况下,有没有办法以某种方式使用反射设置值?

Aby*_*te0 19

我不建议在你的应用程序上这样做,但为了测试目的,它可能是有用的...

假设你有:

public class MyClass
{
     public int MyNumber {get;}
}
Run Code Online (Sandbox Code Playgroud)

如果是出于测试目的,你可以这样做,我不建议你在你的运行时代码中使用它:

var field = typeof(MyClass).GetField("<MyNumber>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(anIstanceOfMyClass, 3);
Run Code Online (Sandbox Code Playgroud)

  • 这也是我的想法。答案应该是:“**尝试找到一个包含您要更改的实际数据的字段。**” (2认同)

Kyl*_*yle 8

你必须记住,属性只是一对方法的语法糖.一个方法(getter)返回属性类型的值,一个方法(setter)接受属性类型的值.

并不要求getter和setter实际获取或设置任何东西.他们只是方法,所以他们可以做任何事情.唯一的要求是getter返回一个值.从外面看,你无法确定是否有支持领域.每次调用时都可以计算getter.它可能基于其他属性.

所以,不,通常没有任何方法可以"设置"没有设置器的属性.

  • @Salgat关键是属性不需要具有后备字段,因此通常不能“知道后备字段”,因为它可能不存在。例如,`public int Property {get {return 5; }完全有效,没有后备字段。此外,一个属性可能取决于多个后备字段,从而进一步弄混了能够“设置”它的含义。例如`public double Length {get {return Math.Sqrt(this.x * this.x + this.y * this.y); }}。 (2认同)
  • @Salgat Kyle 的回答清楚地表明,没有*一般* 的方法可以做到这一点,他是正确的。 (2认同)