C#需要帮助设置只读属性的值

时间:2015-11-12 19:42:44

标签: c# reflection

好的,所以我正在尝试用c#为游戏制作一个mod,我想知道是否有办法使用反射来改变只读属性的值。

我是新来的代码所以我很难过。

5 个答案:

答案 0 :(得分:6)

一般来说,没有。

三个例子:

public int Value { get { return _value + 3; } } // No

public int Value { get { return 3; } } // No

public int Value { get; private set; } // Yes

因此,您可以更改属性的值,而此属性具有相应的private,protected或internal字段。

答案 1 :(得分:5)

试试这个:

typeof(foo).GetField("bar", BindingFlags.Instance|BindingFlags.NonPublic).SetValue(foo,yourValue)

答案 2 :(得分:2)

您可以在这两种情况下:

readonly int value = 4;

int value {get; private set}

使用

typeof(Foo)
   .GetField("value", BindingFlags.Instance)
   .SetValue(foo, 1000); // (the_object_you_want_to_modify, the_value_you_want_to_assign_to_it)

您无法修改

int value { get { return 4; } }

虽然。

如果返回计算值,如

int value { get { return _private_val + 10; } }

您必须相应地修改_private_val

答案 3 :(得分:0)

正如马克所说,有些情况你不能这样做。认为属性本身可以是从其他属性派生的函数。

但是你可能想尝试这里解释的机制:

Is it possible to set private property via reflection?

答案 4 :(得分:0)

是的,这绝对是可能的。无论是好的做法还是对你的目的有帮助,我都不知道。关于@ ske57的好建议,这是一个演示反射的示例程序。初始字段值5和反射字段值75将写入控制台。

cF1.invoke(null, converted);