如何使用c#中的反射更改静态只读字段的值?

unj*_*nj2 5 c# reflection readonly

fieldInfo类中的SetFields方法将对象作为第一个参数.有没有办法在C#中使用反射来更改静态只读字段的值?

到目前为止我有

var field = typeof(ClassName).GetField("FieldName",BindingFlags.Instance|BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)

Gre*_*ech 8

如果你想获得一个静态字段,那么你应该使用BindingFlags.Static而不是BindingFlags.Instance,因为后者是例如字段.

然后,您可以使用它field.SetValue(null, newValue)来设置值.请注意,null可以作为目标参数传递,因为不需要对象实例.假设您有足够的权限,反射将很乐意更改只读字段的值.

  • @AlexDev:JIT 将尝试优化可以直接编码为汇编语言的只读值(“char”、“int”等),因此首次调用方法时字段的值将保留应用程序生命周期的其余部分。[参见此](http://stackoverflow.com/q/38859596/120955) (2认同)

vcs*_*nes 5

你很接近了。您的 BindingFlag 不正确。Instance表示实例字段 相反,您应该使用BindingFlags.Static

var field = typeof(ClassName).GetField("FieldName",BindingFlags.Static|BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)