2013-04-05 1 views
3

작업 대리자에 전달 된 메서드 이름을 가져 오려고합니다. 작업 대리자의 메서드 이름 얻기

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

그리고 주에서

, 이것은이 호출되는 방법은 다음과 같습니다 : 이것은 내가 가진 무엇 DoAction()의 실행 후

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

방법 나는 "DoFoo"와 "도 바르을보고 기대했다 "라고 표시되지만 대신에 < 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

+1

@ programmer93'Expression.Compile()'을 사용하여 그것을'Action'으로 변환합니다. 내 업데이트 답변을 참조하십시오. –