我希望能够从.NET的堆栈框架中获取所有参数值。有点像在Visual Studio调试器中如何查看调用堆栈中的值。我的方法集中在使用StackFrame类,然后在ParameterInfo数组上进行反映。我已经在反射和属性方面取得了成功,但这证明有点棘手。
是否有实现此目标的方法?
到目前为止的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| 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();
}
} |
输出如下:
1 2 3 4 5 6 7
| SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args |
我希望它看起来像这样:
1 2 3 4 5 6
| SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main |
仅出于上下文考虑,我的计划是在抛出自己的异常时尝试并使用它。我将更详细地查看您的建议,看看是否能满足要求。
看来不可能那样做。它只会提供有关方法及其参数的元信息。不是调用栈时的实际值。
有人建议从ContextBoundObject派生您的类,并使用IMessageSink从所有方法调用和参数值中得到通知。通常用于.NET Remoting。
另一个建议可能是编写调试器。这就是IDE获取信息的方式。 Microsoft具有Mdbg,您可以从中获取源代码。或编写CLR分析器。