#c# #reflection
#c# #отражение
Вопрос:
Почему я получаю 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. Это происходит только в скрипте, а не в Visual Studio, например.
Комментарии:
1. Вы спрашиваете о результатах .Net Fiddle? Защищенные / частные поля обычно могут быть прочитаны с использованием отражения.
2. Вы подразумеваете, что это может быть результат только для скрипки .Net? К сожалению, у меня нет настройки среды C # для проверки этого.
3. Он отлично работает в Visual Studio.
4. Ну, тогда ладно. Я соответствующим образом отредактировал вопрос.
Ответ №1:
Это ограничение, наложенное DotNetFiddle из-за того, что ваш код не выполняется с полным доверием (по соображениям безопасности). Следовательно, вы не можете использовать все возможности Reflection API.
Из MSDN:
…, только доверенный код может использовать отражение для доступа к непубличным элементам, которые не были бы напрямую доступны для скомпилированного кода.