FieldInfo.GetValue возвращает значение NULL для закрытого члена, а отладчик указывает, что поле не равно NULL? - PullRequest
3 голосов
/ 14 декабря 2010

В C # / .NET 4.0 я пытаюсь получить значение поля через отражение с помощью:

var bar = foo.GetType()
  .GetField("_myField", BindingFlags.Instance | BindingFlags.NonPublic)
  .GetValue(foo)

Я немного озадачен ситуацией. Возвращаемое значение равно null, и все же поле (при наблюдении через отладчик) не равно нулю. Еще более загадочный код, приведенный выше, работает для других свойств объекта.

Единственным странным аспектом являются два флага IsSecurityCritical и IsSecuritySafeCritical, которые true, но я даже не уверен, что это действительно имеет отношение к ситуации.

Я попал в такую ​​ситуацию с небольшим HttpModule.

public class MyModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += BeginRequest;
    }

    void BeginRequest(object sender, EventArgs e)
    {
         var app = (HttpApplication)sender;

         var rawContent = typeof(HttpRequest)
                .GetField("_rawContent", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(app.Request);

         // at this point 'rawContent' is null, while debugger indicates it is not.
    }
}

Есть ли какие-либо предположения, объясняющие такое поведение?

1 Ответ

5 голосов
/ 14 декабря 2010

Это вызвано моделью безопасности в .net 4.0, когда вы запускаете приложение asp.net, которое, вероятно, не работает с полным доверием.Поскольку это поле критично для безопасности, вы не можете получить к нему доступ через отражение.

Вы можете прочитать в MSDN немного о: Соображения безопасности для отражения

...