【问题标题】:Using reflection to get method name and parameters使用反射获取方法名和参数
【发布时间】:2010-10-03 01:40:42
【问题描述】:

我正在尝试一种基于方法名称和参数以编程方式为Memcached 创建密钥的方法。所以如果我有一个方法,

string GetName(int param1, int param2);

它会返回:

string key = "GetName(1,2)";

我知道你可以使用反射获取 MethodBase,但是如何获取字符串中的参数值,而不是参数类型?

【问题讨论】:

标签: c# .net memcached system.reflection


【解决方案1】:

您无法从反射中获取方法参数值。您必须使用调试/分析 API。您可以获取参数名称和类型,但不能获取参数本身。对不起...

【讨论】:

  • 对于我的问题stackoverflow.com/questions/2729580/…,人们的回答比您也无法获得参数名称——也许这就是您被否决的原因。
  • 使用反射可以获得参数名称:msdn.microsoft.com/en-us/library/…
  • @JonSkeet 这基本上是您的答案here 的副本,只是该答案有一些不错的链接,并且该问题的格式更好一些。
  • @TotZam:嗯,这个答案是在将近 11 个月后写的……我不太确定你评论的目的是什么。
  • @JonSkeet 我最初认为用附加信息更新这个答案可能是有意义的,或者至少有一个链接指向答案的更多信息。如果问题确实相同,那么将其中一个问题作为重复问题关闭可能是有意义的。
【解决方案2】:

您正在寻找的是一个拦截器。顾名思义,拦截器拦截方法调用,并允许您在调用方法之前和之后执行操作。这在许多缓存和日志框架中非常流行。

【讨论】:

    【解决方案3】:

    这是我想出的(但是,它可能不是特别有效):

    MethodBase method = MethodBase.GetCurrentMethod();
    string key = method.Name + "(";
    for (int i = 0; i < method.GetParameters().Length; i++) {
      key += method.GetParameters().GetValue(i);
      if (i < method.GetParameters().Length - 1)
        key += ",";
    }
    key += ")";
    

    【讨论】:

    • 虽然最重要的一点是,我认为这并没有达到您认为的效果,但它效率低下 - 以各种方式。您希望看到一个更高效的版本,它做同样的事情,只是为了教育价值?
    • (循环字符串连接 vs StringBuilder,多次调用 GetParameters() 等)。
    • @JonSkeet - 如果您演示了此方法的正确实现,我将不胜感激。我想将它与 Diagnostic.Stopwatch 结合使用,以根据传递的参数监视某些方法的性能。基本上是在寻找“方法 A (paramA = 1, paramB = 2) 执行时间为 00:00:03.023。
    • @Talon:看看我的答案,还有 Scott Muc 的。
    • 效率低下?是的。做我想做的事吗?对了谢谢!我会改进它,但它很棒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多