如何获取parms的值(使用反射循环)。 在之前的问题中,有人向我展示了如何使用反射来遍历parms。
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 Reflection of all method parameters
谢谢大家 - 看起来像Python,PERL,PHP这很容易 即使它可能不是反射,如果我使用反射来获取字段名称,似乎有一种简单的动态方式来获取基于名称的值。 我还没有尝试过AOP(Aspect Oriented Programming)解决方案。 如果我不能在一两个小时内做到这一点,我可能不会这样做。
答案 0 :(得分:34)
您可以通过在方法中创建匿名类型并利用投影初始化器来解决这个问题。然后,您可以使用反射查询匿名类型的属性。例如:
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));
}
}
答案 1 :(得分:22)
你基本上不能 - 至少没有挂进debugger/profiling API。
理论上可能是StackFrame
类暴露参数值的某种方式,但它没有 - 我怀疑为了这样做,你必须删除几个优化。
答案 2 :(得分:4)
你不能通过反思,也不应该这样做。
如果您需要此类功能,请使用代理,例如通过一个RealProxy实现来拦截你的呼叫。然后,您可以在进行实际呼叫之前检查和修改任何参数(甚至根本不进行原始呼叫,这取决于您)。
答案 3 :(得分:4)
你做不到。反射适用于编译期间嵌入的元数据,此时参数值未知。
答案 4 :(得分:4)
您是否考虑过使用AOP,例如PostSharp?
它可以在方法执行之前访问参数值,因此您的代码将被简化为可重用的属性类,并且属性应用于需要进行此检查的方法。
答案 5 :(得分:2)
使用反射无法获取方法参数的值。因为反射返回元数据信息。如果您想获得特定字段或属性的值,您还需要使用实例(就像您已经知道的那样)。
有几种方法可以使用.NET框架的内部管道来获取参数值 - 即分析器API和调试器API。
你可以使用AOP来做你正在尝试做的事情,有一个名为CThru的Codeplex项目可以帮助你 - 使用CThru你可以在调用方法时拦截它并获取它被调用的参数用。
答案 6 :(得分:0)
PostSharp Diagnostics Toolkit支持IncludeParameterValue选项。
如果您想了解更多有关创建迷你转储的详细信息,
请参阅Accessing stack traces with MDbgEngine and PADRE和Creating a custom PostSharp aspect (with IL transformation)