FieldInfo.getValue Возвращает NULL для частного элемента, когда отладчик указывает на поле, не нулевой?
-
10-10-2019 - |
Вопрос
В 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.
}
}
Любое предложение, которое объяснило бы такое поведение?
Решение
Это вызвано моделью безопасности в .NET 4.0, поскольку вы запускаете приложение ASP.NET, которое, вероятно, не работает в полном доверии. Поскольку поле является защитой, критично, вы не можете получить к нему доступ через отражение.
Вы можете прочитать немного о MSDN о: Соображения безопасности для отражения