使用反射捕获方法状态
时间: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运行时,但是有关如何实现的演示视频(跳至下半部分)可能仍然很有趣。