C#使用reflection获取parms的值

如何获取parms的值(使用reflection循环)。 在之前的问题中,有人向我展示了如何使用reflection来遍历参数。

static void Main(string[] args) { ManyParms("a","b","c",10,20,true,"end"); Console.ReadLine(); } static void ManyParms(string a, string b, string c, int d, short e, bool f, string g) { var parameters = MethodBase.GetCurrentMethod().GetParameters(); foreach (ParameterInfo parameter in parameters) { string parmName = parameter.Name; Console.WriteLine(parmName); //Following idea required an object first //Type t = this.GetType(); //t.GetField(parmName).GetValue(theObject)); } } 

如果您必须知道我为什么要这样做,请参见此处: .NET反映所有方法参数


谢谢大家 – 似乎在Python,PERL,PHP中这很容易。
即使它可能不是reflection,如果我使用reflection来获取字段名称,似乎有一种简单的动态方式来获取基于名称的值。 我还没有尝试过AOP(Aspect Oriented Programming)解决方案。 如果我不能在一两个小时内做到这一点,那么我可能不会这样做。

基本上你不能 – 至少没有挂进调试器/分析API 。

理论上, StackFrame可能有某种方式暴露参数值,但它没有 – 我怀疑为了这样做,你必须删除几个优化。

你可以通过在方法中创建一个匿名类型并利用投影初始化器来解决这个问题。 然后,您可以使用reflection查询匿名类型的属性。 例如:

 static void ManyParms( string a, string b, string c, int d, short e, bool f, string g) { var hack = new { a, b, c, d, e, f, g }; foreach (PropertyInfo pi in hack.GetType().GetProperties()) { Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null)); } } 

你不能通过反思,你不应该这样做。

如果您需要这种function,请使用代理,例如通过RealProxy实现来拦截您的呼叫。 然后,您可以在进行实际呼叫之前检查和修改任何参数(甚至根本不进行原始呼叫,这取决于您)。

你不能这样做。 reflection适用于编译期间嵌入的元数据,此时参数值未知。

您是否考虑过使用AOP,比如PostSharp ?

它可以在方法执行之前访问参数值,因此您的代码将简化为可重用的属性类,并将属性应用于需要进行此检查的方法。

您无法使用reflection获取方法参数的值。 因为reflection返回元数据信息。 如果您想获得特定字段或属性的值,您还需要使用实例(就像您已经知道的那样)。

有几种方法可以使用.NET框架的内部管道来获取参数值 – 即分析器API和调试器API。

您可以将AOP用于您要执行的操作,有一个名为CThru的Codeplex项目可以帮助您 – 使用CThru可以在调用方法时拦截该方法并获取调用它的参数。

PostSharp Diagnostics Toolkit支持IncludeParameterValue选项。

如果您想要创建迷你转储的更多细节,

请参阅使用MDbgEngine和PADRE访问堆栈跟踪以及创建自定义PostSharp方面(使用IL转换)