我希望能够从.NET中的堆栈帧中获取所有参数值。有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式。我的方法集中于使用 堆栈框架类 然后反思 参数信息 大批。我在反射和属性方面取得了成功,但事实证明这有点棘手。

有没有一种方法可以实现这一目标?

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

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

只是为了提供一些上下文,我的计划是在抛出自己的异常时尝试使用它。我会更详细地考虑您的建议,看看是否合适。

有帮助吗?

解决方案

看来这样是不行的。它只会提供有关该方法及其参数的元信息。不是调用堆栈时的实际值。

有些人建议从以下位置派生您的课程 上下文绑定对象 并使用 消息接收器 收到所有方法调用和参数值的通知。这通常用于 .NET 远程处理.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top