Почему я получаю 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, например.
Вы подразумеваете, что это может быть результат только .Net Fiddle? К сожалению, у меня нет среды С#, чтобы проверить это.
Он отлично работает в Visual Studio.
Ну ладно тогда. Я отредактировал вопрос соответственно.
Это ограничение, налагаемое Дотнетфиддл, запрещающее запуск вашего кода в Полное доверие (по соображениям безопасности). Следовательно, вы не можете использовать все возможности Reflection API.
Из MSDN:
..., only trusted code can use reflection to access nonpublic members that would not be directly accessible to compiled code.
Вы спрашиваете о результатах .Net Fiddle? Обычно защищенные/приватные поля можно читать с помощью отражения.