2010-12-14 64 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