为什么在下面的代码中尝试通过反射访问受保护的字段时得到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中发生。
答案 0 :(得分:3)
这是DotNetFiddle所施加的一种限制,即出于安全原因,不能在Full Trust中运行您的代码。因此,您无法利用Reflection API的所有功能。
来自MSDN:
...,只有受信任的代码才能使用反射来访问非公共 编译后的代码无法直接访问的成员。