我希望能够从.NET中的堆栈帧中获取所有参数值。有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式。我的方法集中于使用堆栈框架类 http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe%28v=vs.71%29.aspx然后反思参数信息 http://msdn.microsoft.com/en-us/library/system.reflection.parameterinfo%28v=vs.71%29.aspx大批。我在反射和属性方面取得了成功,但事实证明这有点棘手。
有没有一种方法可以实现这一目标?
到目前为止的代码如下所示:
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Go(1);
}
}
public class A
{
internal void Go(int x)
{
B b = new B();
b.Go(4);
}
}
public class B
{
internal void Go(int y)
{
Console.WriteLine(GetStackTrace());
}
public static string GetStackTrace()
{
StringBuilder sb = new StringBuilder();
StackTrace st = new StackTrace(true);
StackFrame[] frames = st.GetFrames();
foreach (StackFrame frame in frames)
{
MethodBase method = frame.GetMethod();
sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name);
ParameterInfo[] paramaters = method.GetParameters();
foreach (ParameterInfo paramater in paramaters)
{
sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString());
}
sb.AppendLine();
}
return sb.ToString();
}
}
输出如下所示:
SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args
我希望它看起来更像这样:
SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main
只是为了提供一些上下文,我的计划是在抛出自己的异常时尝试使用它。我会更详细地考虑您的建议,看看是否合适。
看来这样是不行的。它只会提供有关该方法及其参数的元信息。不是调用堆栈时的实际值。
有些人建议从以下位置派生您的课程上下文绑定对象 http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx并使用消息接收器 http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.imessagesink.aspx收到所有方法调用和参数值的通知。这通常用于.NET 远程处理 http://en.wikipedia.org/wiki/.NET_Remoting.
另一个建议可能是编写一个调试器。这就是 IDE 获取信息的方式。微软有Mdbg http://blogs.msdn.com/jmstall/archive/2004/09/30/236281.aspx您可以获得其中的源代码。或者写一个CLR 分析器 http://msdn.microsoft.com/en-us/magazine/cc300553.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)