使用反射获取方法名和参数

10

我试图想出一种编程方式来根据方法名称和参数程序化地创建一个Memcached的关键字。因此,如果我有一个方法:

string GetName(int param1, int param2);

它将返回:

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

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


可能是使用反射获取参数值的重复问题。 - Tot Zam
3个回答

15

使用反射无法获取方法参数的值。您必须使用调试/分析 API。您可以获取参数的名称和类型,但无法获取参数本身。抱歉...


1
在我的问题https://dev59.com/o3E85IYBdhLWcg3whUBr中,有人回答说你也无法获取参数名称--也许这就是为什么你被投票降低的原因。 - Tom
2
使用反射,您可以获取参数名称:http://msdn.microsoft.com/zh-cn/library/system.reflection.parameterinfo.aspx - Nelson Rothermel
@JonSkeet 这基本上是你在这里的答案的重复,只不过那个答案有一些不错的链接,而且那个问题的格式稍微好一些。 - Tot Zam
@TotZam:嗯,而且那个回答是写于将近11个月之后...我不太确定你的评论的目的是什么。 - Jon Skeet
@JonSkeet 我最初认为更新此回答并添加额外信息或者至少提供指向包含更多信息的答案的链接可能是有意义的。但如果这些问题实际上是一样的,那么关闭一个问题作为副本可能是有道理的。 - Tot Zam

4
您需要的是拦截器。正如名称所示,拦截器可以拦截方法调用,并允许您在方法被调用之前和之后执行一些操作。这在许多缓存和日志框架中非常流行。

-2

这是我想出来的(但可能不是特别高效的):

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 += ")";

3
最重要的一点是,我认为它并不是你想象中的那样,虽然它能完成任务,但效率确实很低 - 在多个方面都是。你想看一个更高效的版本吗?它能完成同样的任务,只是作为教育参考。 - Jon Skeet
1
循环字符串拼接与 StringBuilder、多次调用 GetParameters() 等与编程有关的内容。 - Marc Gravell
1
@JonSkeet - 如果您能演示一下这个方法的正确实现,我将不胜感激。我想与Diagnostic.Stopwatch一起使用它来监视一些根据传递参数而定的方法的性能。基本上是在寻找“Method A(paramA = 1,paramB = 2)执行需要00:00:03.023的时间。” - Talon
1
@Talon:请参考我的答案和Scott Muc的。 - Jon Skeet
低效?是的。做我想要的事情?是的...谢谢!我会改进它,但它很棒。 - ManuelCanepa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接