使用反射捕获方法状态

时间:2020-03-06 15:05:29  来源:igfitidea点击:

有没有一种方法可以使用.NET反射来捕获所有参数/局部变量的值?

解决方案

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

我们可能想看看StackTrace

http://msdn.microsoft.com/zh-CN/library/system.diagnostics.stacktrace.aspx

好文章在这里:

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

我们可以使用CLR调试API来获取此信息,尽管提取它并不是简单的几行。

反射将告诉我们方法具有的参数类型,但在任​​何特定的调用过程中都无助于发现其值。反射根本不告诉我们有关局部变量的任何信息。

我们需要调试器用来访问此类信息的API。

我认为这是不可能的,我们可以通过查看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();
          }
     }
}

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

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

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

他们的脚本语言在Mono(.NET运行时的开源实现)上运行。我怀疑他们的解决方案是否适用于常规的.NET运行时,但是有关如何实现的演示视频(跳至下半部分)可能仍然很有趣。