通过反射访问受保护字段时出现FieldAccessException

时间:2019-04-07 15:32:16

标签: c# reflection

为什么在下面的代码中尝试通过反射访问受保护的字段时得到FieldAccessException

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Foo foo = new Foo();

        BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.NonPublic 
                                | BindingFlags.Public | BindingFlags.Static;
        FieldInfo fieldInfo = foo.GetType().GetField("field", bindFlags);

        Object fieldValue = fieldInfo.GetValue(foo);
    }
}

public class Foo 
{   
    public Foo() {
        field = 1;  
    }

    protected int field;    
}

这个小提琴给了我一个例外:https://dotnetfiddle.net/wu5vDX,但是绑定标志不应该确保我能够访问该字段吗?

编辑:显然,这是仅.Net Fiddle结果。例如,它只会在小提琴中发生,而不会在Visual Studio中发生。

1 个答案:

答案 0 :(得分:3)

这是DotNetFiddle所施加的一种限制,即出于安全原因,不能在Full Trust中运行您的代码。因此,您无法利用Reflection API的所有功能。

来自MSDN

  

...,只有受信任的代码才能使用反射来访问非公共   编译后的代码无法直接访问的成员。