2013-04-05 3 views
3

Я пытаюсь получить имя метода, переданное в делегат Action. Это то, что у меня есть:Получение имени метода из делегата действия

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

И в основном, это то, как она вызывается:

DoAction(y => y.DoBar(), z => z.DoFoo()); 

После выполнения 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

Как я могу вызвать метод сейчас? Действие() не работает. Expression.Invoke() также требует аргументов для метода. Предполагая, что методы Foo() и Bar() принимают аргументы, как указать аргументы в main и вызвать их в DoAction()? – PoweredByOrange

+1

@ programmer93 использовать 'Expression.Compile()' для преобразования его в 'Action'. См. Мой обновленный ответ. –