【问题标题】:Capturing method state using Reflection使用反射捕获方法状态
【发布时间】:2008-10-03 19:04:46
【问题描述】:

有没有办法使用 .NET 反射来捕获所有参数/局部变量的值?

【问题讨论】:

  • 你能提供一个你想要实现的用例吗?

标签: c# .net reflection


【解决方案1】:

您可以使用CLR debugging API 获取此信息,但提取它并不是简单的几行。

【讨论】:

【解决方案2】:

反射不用于从堆栈中捕获信息。它读取大会。

您可能想看看 StackTrace

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

这里有好文章:

http://www.codeproject.com/KB/trace/customtracelistener.aspx

【讨论】:

    【解决方案3】:

    反射会告诉您方法具有的参数类型,但它不会帮助您在任何特定调用期间发现它们的值。反射根本不会告诉您有关局部变量的任何信息。

    您需要调试器用来访问此类信息的那种 API。

    【讨论】:

      【解决方案4】:

      我认为这是不可能的,你可以通过查看 StackTrace 来获取方法及其参数。

      System.Diagnostics.StackTrace sTrace = new System.Diagnostics.StackTrace(true);
      for (Int32 frameCount = 0; frameCount < sTrace.FrameCount; frameCount++){ 
           System.Diagnostics.StackFrame sFrame = sTrace.GetFrame(frameCount);
           System.Reflection.MethodBase thisMethod = sFrame.GetMethod();
           if (thisMethod == currentMethod){
                if (frameCount + 1 <= sTrace.FrameCount){
                     System.Diagnostics.StackFrame prevFrame = sTrace.GetFrame(frameCount + 1);
                     System.Reflection.MethodBase prevMethod = prevFrame.GetMethod();
                }
           }
      }
      

      【讨论】:

        【解决方案5】:

        我不知道如何使用反射,但看看使用编织。 SpringFramework.Net 允许您定义可以拦截方法调用的切入点。其他人可能也会这样做。

        这是“BeforeAdvice”拦截器的链接 http://www.springframework.net/docs/1.2.0-M1/reference/html/aop.html#d0e8139

        【讨论】:

          【解决方案6】:

          secondlife 的人员暂停脚本并在服务器之间移动它们。这意味着它们必须捕获正在运行的脚本的状态,包括调用堆栈上的变量值。

          他们的脚本语言在 mono 上运行,mono 是 .NET 运行时的开源实现。我怀疑他们的解决方案是否适用于常规的 .NET 运行时,但 video of the presentation on how they did it(跳到后半部分)可能仍然很有趣。

          【讨论】:

            猜你喜欢
            • 2012-08-08
            • 2011-05-06
            • 2011-07-25
            • 1970-01-01
            • 2016-10-10
            • 1970-01-01
            相关资源
            最近更新 更多