2013-04-05 73 views
3

我试图让传入动作委托的方法名。这是我有:从动作委托获取方法名

private static void DoAction(params Action<Group>[] actions) 
{ 
    foreach (Action<Group> action in actions) 
    { 
     Console.WriteLine(action.Method.Name); 
    } 
} 

而且在主要的,这是它如何被称为:

​​

DoAction()执行后的方法,我希望能看到“DoFoo”和“DoBar “在屏幕上,但它反而我看到< Main>b__0<Main>b__1。我只是想知道是否有办法从动作委托中获取目标方法的实际名称?任何帮助表示赞赏。

回答

7

可以更改输入型到Expression,然后看看是否表达的是一个方法调用:

private static void DoAction(params Expression<Action<Group>>[] actions) 
{ 
    foreach (var exp in actions) 
    { 
     var method = exp.Body as MethodCallExpression; 
     if(method != null) 
      Console.WriteLine(method.Method.Name); 

     // similar method for properties 
     var member = exp.Body as MemberExpression; 
     if (member != null) 
      Console.WriteLine(member.Member); 

     // execute the Action 
     Action<Group> act = exp.Compile(); 

     Group g = new Group(); // create a Group to act on 
     act(g); // perform the action 

    } 

} 
+0

如何我现在可以调用该方法? action()不起作用。 Expression.Invoke()还需要该方法的参数。假设Foo()和Bar()方法都带参数,那么如何在main中指定参数并在DoAction()中调用它? – PoweredByOrange 2013-04-05 21:03:15

+1

@ programmer93使用'Expression.Compile()'将其转换为'Action'。看到我更新的答案。 – 2013-04-05 21:11:16