Исключение FieldAccessException при доступе к защищенному полю через отражение

#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:

…, только доверенный код может использовать отражение для доступа к непубличным элементам, которые не были бы напрямую доступны для скомпилированного кода.