【问题标题】:C# Getting value of params using reflectionC#使用反射获取参数的值
【发布时间】:2010-12-24 11:02:46
【问题描述】:

如何获取 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(面向方面​​编程)的解决方案。 这是如果我不能在一两个小时内完成的事情之一,我可能不会这样做。

【问题讨论】:

  • 也许可以通过反射检查使用 IEnumerable 时生成的状态机来完成一些事情?只是一个我不知道如何实现自己的想法:-)(由于今天重复的问题在这里评论)

标签: c# reflection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    PostSharp Diagnostics Toolkit 支持 IncludeParameterValue 选项。

    如果您想了解有关创建迷你转储的更多详细信息,

    Accessing stack traces with MDbgEngine and PADRECreating a custom PostSharp aspect (with IL transformation)

    【讨论】:

      【解决方案3】:

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

      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));
          }
      }
      

      【讨论】:

      • 这需要您更改方法的内容。如果您要这样做,则无论如何都可以报告这些值。这种语法使它更容易做到这一点,但我怀疑它真的会帮助 OP。
      • @Jon:当然,你是对的,但这比手动输入要很多,因为没有像@987654322 这样的多个硬编码行@ 等,错误的范围要小得多。
      • 在 PostSharp 或 Fody 之类的应用中,这将是一件很棒的事情。
      【解决方案4】:

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

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

      您可以将 AOP 用于您正在尝试做的事情,有一个名为 CThru 的 Codeplex 项目可能会对您有所帮助 - 使用 CThru 您可以在调用该方法时拦截该方法并获取调用它的参数。

      【讨论】:

        【解决方案5】:

        你不能那样做。反射作用于编译期间嵌入的元数据,当时参数值未知。

        【讨论】:

        • 但是您可以使用反射来获取对象中的属性值——这在编译时是未知的。
        【解决方案6】:

        你不能通过反射,而且你也不应该这样做。

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

        【讨论】:

        • 如果我有更多时间,我会研究这个。如果你看到我上面提到的帖子,我正在使用 Microsoft Host Integration Server,特别是 HIP - 不确定代理将如何与这些人一起玩。
        【解决方案7】:

        你不能,基本上 - 至少不能不连接到 debugger/profiling API

        理论上 可能 StackFrame 类会以某种方式公开参数值,但事实并非如此 - 我怀疑为了这样做,您必须删除几个优化。

        【讨论】:

        • 请指导,如何在 C# 中获取函数形式参数列表...?我需要动态获取函数的形参
        • @Vikrant:我建议你问一个更详细的新问题。
        • Question 已添加,请提供有用的信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        相关资源
        最近更新 更多