我在当前项目中大量使用反射来大大简化我的控制器和wcf服务之间的通信。我现在要做的是从一个没有直接访问HttpSessionStateBase的对象中获取Session的值(IE:不是控制器)。例如,ViewModel。我可以将它传递给它或传递给它等等,但在我的情况下这不是最佳的。
由于在我的场景中某些时候所有内容都来自Controller,我可以执行以下操作,将麻烦转移到发起呼叫的控制器,非常简单:
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属性,以便我可以从中读取。
答案 0 :(得分:4)
这是不可能的。参数传递给方法的方式是一个实现细节,留给JIT编译器。例如,x86和x64之间有很大的不同。 x86在堆栈上传递参数,x64通过寄存器传递前4个参数。浮点值在FPU堆栈或SSE寄存器上传递。等等。
调试器通过使用JIT编译器生成的调试信息来了解详细信息。但是在程序中使用调试接口是行不通的,程序无法自行调试。
答案 1 :(得分:3)
我不认为这是可能的。 StackTrace
和StackFrame
只是为您提供有关谁调用您的方法的元数据信息,而不是您需要的实际实例。
答案 2 :(得分:1)
为什么不能使用HttpContext.Current.Session?您不希望引用Web部件?否则我认为你需要一个接口 - 在某个地方设置会话外观(总是很有用) - 单例很有用,或者可以使用像unity这样的容器来设置它。 httpContext是线程感知的,它服务sesion相当不错。您可以通过提供我之前说过的外观来对会话进行抽象,使其更加与提供程序无关,但仍然在生产代码中使用调试基础结构......有问题。:) 如果你不想要耦合,也许你可以在某种意义上使用IL生成?