2010-03-13 103 views
2

我在當前項目中大量使用反射來大大簡化我的控制器和wcf服務之間的通信。我現在想做的是從一個沒有直接訪問HttpSessionStateBase(IE:不是控制器)的對象中從Session中獲取一個值。例如,一個ViewModel。我可以通過它或通過它的參考等,但這不是我的情況最佳。C#反射StackTrace獲取值

因爲一切都在我的情況有些點來自一個控制器,我可以做到以下幾點走麻袋到發起呼叫控制器,很簡單的東西:

 
var trace = new System.Diagnostics.StackTrace(); 

foreach (var frame in trace.GetFrames()) 
{ 
    var type = frame.GetMethod().DeclaringType; 
    var prop = type.GetProperty("Session"); 

    if(prop != null) 
    { 
    // not sure about this part... 
    var value = prop.GetValue(type, null); 
    break;  
    } 
}

這裏的問題是我似乎無法解決如何獲取控制器或Session屬性的「實例」,以便我可以從中讀取它。

+1

小心這樣工作:JITcompiler可以內聯函數/屬性,因此在發佈版本中不會看到它們。 – Stormenet 2010-03-13 13:51:27

回答

1

爲什麼你不能使用HttpContext.Current.Session?你不想引用Web部件?否則,我認爲你需要一個界面 - 在某個地方設置會話外觀(這總是很有用) - 單例是有用的,或者可以使用像unity這樣的容器來設置它。 httpContext是線程感知的,它服務於sesion相當不錯。您可以通過提供我之前說過的Facade來使會話抽象化,以使其更加與提供程序無關,但仍然在生產代碼中使用調試基礎結構是有問題的:) 也許您可以在某種意義上使用IL代不想要耦合?

+0

我一直在想它。謝謝,那正是我需要的。 – John 2010-03-13 16:43:32

3

我不認爲這是可能的。 StackTraceStackFrame只是給你關於誰調用你的方法的元數據信息,而不是你需要的實際實例。

4

這是不可能的。參數傳遞給方法的方式是實現細節,留給JIT編譯器。例如,x86和x64之間的差別很大。 x86在堆棧上傳遞參數,x64通過寄存器傳遞前4個參數。浮點值在FPU堆棧或SSE寄存器上傳遞。等等。

調試器通過使用由JIT編譯器生成的調試信息來了解細節。但是,在程序中使用調試接口無法正常工作,程序無法自行調試。

+0

非常好的信息。非常感謝! – John 2010-03-13 16:43:49