我想写一个通用的处理函数跟踪方法的调用情况,即记录指定方法调用时各个参数的传递情况:
public void MyMethod(相关参数定义)
{
TraceMethod(MethodBase.GetCurrentMethod() as MethodInfo);
}
void TraceMethod(MethodInfo method)
{
XElement root = new XElement("root");
foreach(ParameterInfo in method.GetParameters())
{
if(info.IsOut)
{
continue;
}
root.Add(new Element(info.Name, info.Value));
}
}
请问该通过怎样的手段获取上述info.Value?
你在TraceMethod里只传入了MethodInfo,这里只包含了参数的定义信息。你这么想,假设你有个方法:
class A
{
public void M(string s) { }
}
这个时候你可以得到M的参数s的ParameterInfo,但是这个时候它根本没有值(也不应该有),它的值只有当你去调用这个方法时才确定。而只有MethodInfo/ParameterInfo是不行的。你这里可以给TraceMethod加个参数:
void TraceMethod(MethodInfo method, params object[] parameters)
然后在MyMethod里调用它的时候把MyMethod的参数都传过去。
如果是这样,也就不会有这个问题了。我是希望能主动的获取,而不是被动的把参数传递过来。
我的目的,其实也就是如何在一个函数被调用的时候,获取当前这个函数的调用环境。
@笨笨蜗牛: 那你只能用AOP的方式,根据上下文去获取到值。园子里讲各种AOP实现的文章很多,自己搜一下吧。不过代价都比较大,除非用现成的编译期注入AOP框架如POST SHARP。
MethodBase.GetCurrentMethod()不反映调用方法时使用的类型参数,所以你就不能从MethodInfo 中获取到调用方法时使用的参数值,只能想办法传进TraceMethod方法中去。