我希望能够从.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 票数:7 已采纳

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

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

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

  ask by Martin Clarke translate from so

未解决问题?本站智能推荐:

1回复

获取调用方法的参数值

有什么方法可以在托管代码中进行操作,或者至少没有严重的性能问题? 基本上,我想得到的当然是 但是,a,我怀疑这对我来说是一厢情愿的想法。 更新 冒着陷入XY问题的风险时,也许我确实应该寻求建议,而不是再次尝试从事自行车制造行业。 问题基本上是我必须编写一堆带有可变参数
5回复

如何在堆栈中获取本地和参数的当前值?

在.NET应用程序中,我有一些要点,我需要收集有关当前线程状态的一些调试信息。 我可以获得一些new StackTrace()构造函数。 特别是,我可以获取当前堆栈帧的列表,包括相应的MethodInfo对象,它可以为我提供IL代码,局部变量和参数的数量以及参数名称。 如何获取这些
2回复

如何从C#中的先前方法调用中获取参数值? [重复]

这个问题已经在这里有了答案: 如何获得调用方法的参数值? 5个答案 这个问题与我先前的问题有关。 如何获取在C#中调用的参数先前方法的IDictionary <string,object>? 。 我编写了代码,但是仍然缺少一部分。 如何从参数中获
1回复

如何从StackTrace获取参数值

这个问题已经在这里有了答案 : 是否可以获取.NET中调用堆栈中每个帧的参数值 (2个答案) 6年前关闭。 从方法调用中,我需要在堆栈上“跳”三
2回复

是否可以从堆栈跟踪中获取实际类型?

我正在编写一个ExceptionFactory类,使用System.Diagnostics.StackTrace 。 现在,对于课程 method.DeclaringType将返回typeof(Base) 。 但是,我需要typeof(A) 。 有可能得到某种方式吗?
4回复

如何从Enum获取数值?

例如System.Net.HttpStatusCode Enum,我想获取HTTP状态代码而不是HTTP状态文本。 System.Net.HttpStatusCode.Forbidden应返回403而不是“Forbidden”。 我该如何提取价值?
4回复

.NET Reflection - 如何从ParameterInfo中获取“真实”类型

我正在尝试验证参数是否为out参数并扩展接口(ICollection)。 反射api似乎不想给我参数的“真实”类型,只有最后一个“&”的参数不会在IsAssignableFrom语句中正确评估。 我写了一些有效的c#代码,但似乎应该有更好的方法来做到这一点。 有没有办法获得realT
3回复

如何使用.net中的反射获取对象名称?

在.net中如何在声明类型中获取对象的名称。 例如...
3回复

获取.NET类中的枚举类型

考虑以下C#类声明: 它位于一个单独的类库/ DLL中。 仅给出typeof(MyClass)对象(System.Type),有没有办法检查该类是否包含一个名为Colors的运行时枚举,如果是,则返回相应的System.Type对象? 我正在尝试做的是编写一些给定类的类型的通
6回复

如何在SQL中检索给定StoredProcedure参数的.NET类型?

我正在SQL程序之上创建'通用'包装器,我可以解析所有必需参数的名称和sqltypes,但有没有办法如何获得它的'底层'.NET类型? 我的目标是做一些事情: GetNETType是我需要的东西。 我知道它可以写成param.SqlDbType中的开关,但这是更短的方式,更短的注