当前位置:  开发笔记 > 编程语言 > 正文

从.NET中的堆栈帧获取参数值?

如何解决《从.NET中的堆栈帧获取参数值?》经验,为你挑选了1个好方法。

我希望能够从.NET中的堆栈帧获取所有参数值.有点像在Visual Studio调试器中看到调用堆栈中的值的方式.我的方法集中在使用StackFrame类,然后反映在ParameterInfo数组上.我在反射和属性方面取得了成功,但事实证明这有点棘手.

有没有办法实现这一目标?

到目前为止,代码如下所示:

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

仅仅为了一些上下文,我的计划是在我抛出自己的异常时尝试使用它.我会更详细地看看你的建议,看看我是否能看到它合适.



1> Lars Truijen..:

似乎不可能那样做.它仅提供有关方法及其参数的元信息.不是callstack时的实际值.

有人建议从ContextBoundObject派生您的类,并使用IMessageSink通知所有方法调用和参数值.这通常用于.NET Remoting.

另一个建议可能是编写调试器.这就是IDE获取其信息的方式.Microsoft有Mdbg,您可以从中获取源代码.或者写一个CLR分析器.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有