如何获取调用方法的参数值?问题我正在编写一些代码,需要能够从调用类的方法中获取参数值。我知道如何一直到ParameterInfo[]数组,但我不知道如何获取值。这可能吗?如果是,我认为它与使用MethodInfo对象的MethodBody属性有关,它允许您检查IL流,包括属性,但我不知道如何,而且我还没有找到在Google上运行的代码。代码//从调用该类的类中查找调用方法varmethodInfo=frame.GetMethod();if(methodInfo.DeclaringType!=this.GetType()){stringmethodName=frame.GetMethod().Name;varparamInfos=methodInfo.GetParameters();//怎么办??我如何从paramInfosbreak中获取值;}elseif(i==frameCount-1){thrownewTransportException("Couldn'tfindmethodname");}}}}如果不自己检查堆栈就无法做到这一点(这是脆弱的,因为许多优化可能意味着堆栈框架不是您所期望的,甚至传递的参数实际上不是方法签名所暗示的(优化的JIT编译器完全有可能发现您只使用了对象/结构的子字段并将其传入。ParameterInfo只告诉您编译方法的签名,而不是传递的值。实现这一目标的唯一现实方法是通过代码注入(通过AOP之类的东西)来创建数据并根据分析IL执行您想要的操作。如果您需要使用调试器调试某些东西,如果您需要记录有关您正在记录的内容,这通常不是一个好主意。需要明确的是,简单的反射技术无法实现您想要的完全通用性。Microsoft的JonathanKeljo在这个新闻组帖子中说:不幸的是,今天从调用堆栈获取参数信息的唯一简单方法是使用调试器。如果您尝试将此作为应用程序错误日志记录的一部分,并且您计划将错误日志发送回支持部门,我们希望将来您能够使用小型转储来实现此目的。(今天,使用带有托管代码的小型转储有点问题,因为它不包含足够的信息来默认甚至获得堆栈跟踪。带有堆的小型转储更好,但如果你知道我的意思,那么“迷你”更少意思是。)一个纯粹主义者会说,允许人们编写可以从调用堆栈中其他地方的函数获取参数的代码将鼓励他们打破封装并创建在面对变化时非常脆弱的代码。(您的场景没有这个特殊问题,但我听说过其他对此功能的请求。无论如何,大多数请求都可以通过其他方式解决,例如使用线程存储。)然而,更重要的是,有这一点的安全隐患——允许插件的应用程序冒着这些插件获取敏感信息的堆栈的风险。我们当然可以将该功能标记为需要完全信任,但这会使它对我听说过的几乎所有情况都毫无用处。JonathanSo...我想简短的回答是“我不能”。太糟糕了。是的,你可以这么做。您需要做的是使用IL反汇编程序(在System.Reflection.Emit命名空间中实现)找到包含您要查找的参数值的操作数。从这个问题开始:C#反射并找到所有引用,然后使用答案中提到的类(来自Mono.Reflection)进行检查。像这样:varinstructions=method.GetInstructions();foreach(varinstructionininstructions){varmethodInfo=instruction.OperandasMethodInfo;如果(methodInfo==null){继续;}if(instruction.OpCode.Name.Equals("call")&&methodInfo.Name.Equals("YourMethodHere")){varvalue=(CastToMyType)instruction.Previous.Operand;//现在你有了值...}}你不能用StackFrame或StackTrace执行这个操作。但是,您可以使用一些拦截框架(例如Spring.NET中的AOP),以便您可以获取参数值。请参阅此处:您能否在C#中获取堆栈上的变量列表?根据对我的回答的所有评论,我认为这是不可能的。PropertyInfo类有一个GetValue方法,但这需要您有一个实际的对象来从中获取值。以上就是C#学习教程:如何获取调用方法的参数值?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
