C#Reflection StackTrace获取值

时间:2010-03-13 13:48:51

标签: c# model-view-controller reflection stack-trace

我在当前项目中大量使用反射来大大简化我的控制器和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属性,以便我可以从中读取。

3 个答案:

答案 0 :(得分:4)

这是不可能的。参数传递给方法的方式是一个实现细节,留给JIT编译器。例如,x86和x64之间有很大的不同。 x86在堆栈上传递参数,x64通过寄存器传递前4个参数。浮点值在FPU堆栈或SSE寄存器上传递。等等。

调试器通过使用JIT编译器生成的调试信息来了解详细信息。但是在程序中使用调试接口是行不通的,程序无法自行调试。

答案 1 :(得分:3)

我不认为这是可能的。 StackTraceStackFrame只是为您提供有关谁调用您的方法的元数据信息,而不是您需要的实际实例。

答案 2 :(得分:1)

为什么不能使用HttpContext.Current.Session?您不希望引用Web部件?否则我认为你需要一个接口 - 在某个地方设置会话外观(总是很有用) - 单例很有用,或者可以使用像unity这样的容器来设置它。 httpContext是线程感知的,它服务sesion相当不错。您可以通过提供我之前说过的外观来对会话进行抽象,使其更加与提供程序无关,但仍然在生产代码中使用调试基础结构......有问题。:) 如果你不想要耦合,也许你可以在某种意义上使用IL生成?