使用反射获取方法名和参数
Posted
技术标签:
【中文标题】使用反射获取方法名和参数【英文标题】: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,但是如何获取字符串中的参数值,而不是参数类型?
【问题讨论】:
Getting value of parms using reflection的可能重复 【参考方案1】:您无法从反射中获取方法参数值。您必须使用调试/分析 API。您可以获取参数名称和类型,但不能获取参数本身。对不起...
【讨论】:
对于我的问题***.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 的。 效率低下?是的。做我想做的事吗?对了谢谢!我会改进它,但它很棒以上是关于使用反射获取方法名和参数的主要内容,如果未能解决你的问题,请参考以下文章
阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_10_反射_Class对象功能_获取Method成员方法