using System;
using System.Reflection;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
var fieldInfo = typeof(TestClass).GetField("x", flags);
var value = fieldInfo.GetValue(new TestClass());
Console.WriteLine(value.ToString());
fieldInfo.SetValue(null, 2);
var target = new TestClass();
Console.WriteLine(target);
Console.ReadKey();
}
}
public class TestClass
{
private static readonly int x = 1;
}
}
这份代码.net core 2.0
上是可以正常使用,升级到.net core 3.1
之后,运行会出现如下的报错:
Unhandled exception. System.FieldAccessException: Cannot set initonly static field 'x' after type 'ConsoleApp1.TestClass' is initialized.
在升级到.net core 3.0
之后,已不在支持通过FieldInfo.SetValue
来修改内部私有字段的值,一直以来通过这个方法来修改私有字段值并不安全可靠,在不同的情况下,会出现不一样的效果,所以在3.0
之后,使用SetValue
之后会出现 Cannot set initonly static field
的异常。对于我这里的需求的话,可以通过类的方法来修改内部值。
去掉 readonly
嗯,去掉readonly
可以通过 fieldInfo.GetValue
获取值,无法通过 fieldInfo.SetValue
来设置值。