2010-12-14 61 views
3

在C#/。NET 4.0我试图通过反射与检索字段值:FieldInfo.GetValue在调试器指示字段非空时为私有成员返回null?

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

我有点被困惑的情况。返回的值是null,然而,该字段(通过调试器观察时)不为空。更令人费解的是,上面的代码适用于其他对象属性。

唯一的奇怪的方面是IsSecurityCriticalIsSecuritySafeCritical这两个标记是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. 
    } 
} 

任何建议,可以解释这种行为?

+0

调试器有时打的代码路径,你不要指望在正常条件下看不到(如的ToString()方法,延迟加载的东西,等等...)。在这些情况下检查代码是否运行正常的唯一方法是测试没有附加的调试程序。这就是应用于.NET编程的海森堡不确定性原理:-) – 2010-12-14 16:37:48

+0

字段类型是否可空? (IE:int?,bool?等) – 2010-12-14 16:38:08

+0

字段不可为空。 – 2010-12-14 16:52:55

回答

5

这是由.NET 4.0中的安全模型引起的,因为您正在运行一个asp.net应用程序,该应用程序可能没有完全信任地运行。由于该字段对安全至关重要,因此无法通过反射访问它。

您可以在MSDN大约读了一下:Security Considerations for Reflection