.net core 3.1 反射修改静态私有字段的值出错?

2019-12-16 18:36发布

问题:

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.

回答1:

在升级到.net core 3.0之后,已不在支持通过FieldInfo.SetValue 来修改内部私有字段的值,一直以来通过这个方法来修改私有字段值并不安全可靠,在不同的情况下,会出现不一样的效果,所以在3.0之后,使用SetValue之后会出现 Cannot set initonly static field 的异常。对于我这里的需求的话,可以通过类的方法来修改内部值。



回答2:

去掉 readonly