【问题标题】:C# Reflection StackTrace get valueC# 反射 StackTrace 获取值
【发布时间】:2023-03-05 22:02:01
【问题描述】:

我在当前项目中大量使用反射来大大简化我的控制器和 wcf 服务之间的通信。我现在要做的是从无法直接访问 HttpSessionStateBase 的对象中的 Session 获取值(IE:不是控制器)。例如,视图模型。我可以传递它或传递对它的引用等,但这在我的情况下并不是最佳的。

由于在我的场景中的某个时刻所有内容都来自控制器,我可以执行以下操作来将麻袋传送到发起调用的控制器,这很简单:

var trace = new System.Diagnostics.StackTrace(); foreach(trace.GetFrames() 中的 var 帧) { var type = frame.GetMethod().DeclaringType; var prop = type.GetProperty("Session"); 如果(道具!=空) { // 不确定这部分... var value = prop.GetValue(type, null); 休息; } }

这里的问题是我似乎无法弄清楚如何获取控制器的“实例”或 Session 属性,以便我可以从中读取。

【问题讨论】:

  • 注意这样的工作:JITcompiler 可以内联函数/属性,因此您不会在发布版本中正确看到它们。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为什么不能使用 HttpContext.Current.Session?您不想引用 Web 部件吗?否则,我认为您将需要一个界面-在某处设置会话外观(这总是有用的)-单例很有用,或者可能使用像unity这样的容器来设置它。 httpContext 是线程感知的,它为会话提供了很好的服务。您可以通过提供我之前所说的外观来对会话进行抽象,以使其更加与提供者无关,但仍然在生产代码中使用调试基础设施......值得怀疑。:) 如果您不想要耦合,也许您可​​以在某种意义上使用 IL 生成?

      【讨论】:

      • 我肯定是想多了。谢谢,这正是我所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2011-02-15
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多