【问题标题】:Can I get the name of a method by providing the method itself?我可以通过提供方法本身来获取方法的名称吗?
【发布时间】:2012-09-26 20:36:35
【问题描述】:

有没有办法通过提供方法本身来获取方法的名称(作为字符串)?

class Person
{
    bool Eat(Food food){...}
}

我想以某种方式获得字符串“Eat”。就这样!这可以来自实例,也可以来自使用反射的类声明。

我的尝试:

public delegate bool EatDelegate(Food f);

EatDelegate eatDel = new EatDelegate(_person1.Eat);
string methodName = eatDel.GetInvocationList()[0].Method.Name;

这需要知道方法的委托,整个事情是不可读的

我想要 methodName 以便动态调用它。

注意事项:

  • 我要调用的每个方法都有一个委托声明
  • 我想避免指定方法的名称,以避免反射等后出现错误
  • 当我想获得它的名字时,没有调用该方法。 (不能使用MethodBase.GetCurrentMethod()
  • 我必须使用 .Net 3.5

【问题讨论】:

  • 可以用表达式解决问题...

标签: c# reflection .net-3.5


【解决方案1】:
public string GetName(Expression<Action> exp)
{
    var mce = exp.Body as MethodCallExpression;
    return mce.Method.Name;
}

--

一种方法

public int  MyMethod(int i)
{
    return 0;
}

和用法

 var s= GetName(()=>this.MyMethod(0));

【讨论】:

  • 这个方法会运行一次吗?
【解决方案2】:
var methods = typeof(Person).GetMethods();
foreach (var method in methods)
{
    if (method.Name.Equals("Eat"))
    {
         // do something here...
    }
}

【讨论】:

  • 这是我想要避免的。必须指定“Eat”字符串值。
  • 来自问题:“我想以某种方式获得字符串“Eat”。仅此而已!” and “我想避免指定方法的名称"
  • 没错。正如您在 L.B.s 的回答中看到的,这是使用对象的实例完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多