首页 新闻 会员 周边

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

0
悬赏园豆:10 [已解决问题] 解决于 2019-12-16 18:50
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.
ohyex的主页 ohyex | 小虾三级 | 园豆:1496
提问于:2019-12-16 16:00
< >
分享
最佳答案
1

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

ohyex | 小虾三级 |园豆:1496 | 2019-12-16 18:50
其他回答(1)
0

去掉 readonly

收获园豆:10
dudu | 园豆:30994 (高人七级) | 2019-12-16 16:54

嗯,去掉readonly 可以通过 fieldInfo.GetValue 获取值,无法通过 fieldInfo.SetValue 来设置值。

支持(0) 反对(0) ohyex | 园豆:1496 (小虾三级) | 2019-12-16 18:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册