2009-11-28 2 views
0

메서드를 사용하여 메서드의 이름이 들어있는 문자열 값을 기반으로 메서드를 호출 할 수 있습니까?액션 <T> 문자열 값을 기반으로 메서드를 호출하는 방법

+0

이 질문에 동적 태그를 추가 했으므로 .NET 4의 새로운 동적 키워드에 대해 묻고 있습니까? 시도한 코드와 작동하지 않는 코드가 있습니까? 당신이하려는 일의 맥락을 보는 데 도움이 될 수 있습니다. – CoderDennis

답변

5

Action<T>은 지정된 메소드를 가리킬 수있는 델리게이트 유형입니다. 당신은 문자열 변수에 저장된 이름이 실행시에 알려져있는 방법을 호출 할 경우, 당신은 반사를 사용해야 할 필요가 : 당신이 Delegate.CreateDelegate을 사용할 수 앤드류에 의해 제안

class Program 
{ 
    static void Main(string[] args) 
    { 
     string nameOfTheMethodToCall = "Test"; 
     typeof(Program).InvokeMember(
      nameOfTheMethodToCall, 
      BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static, 
      null, 
      null, 
      null); 
    } 

    static void Test() 
    { 
     Console.WriteLine("Hello from Test method"); 
    } 
} 

MethodInfo에서 대리자 형식을 만듭니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     string nameOfTheMethodToCall = "Test"; 
     var mi = typeof(Program).GetMethod(nameOfTheMethodToCall, BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static); 
     var del = (Action)Delegate.CreateDelegate(typeof(Action), mi); 
     del(); 
    } 

    static void Test() 
    { 
     Console.WriteLine("Hello from Test method"); 
    } 
} 
+0

'Delegate.CreateDelegate'를 사용하면 요청 된 OP와 마찬가지로'MethodInfo'에 대한 델리게이트를 생성 할 수 있습니다. –

+0

위대한 발언 @ 앤드류. 예를 들어 답을 업데이트했습니다. –

+0

정중하게 :) :) (+1) –

2

난 당신이 정말 Action<T> 단지 일반적인 방법을 원하는 생각하지 않습니다.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName); 
    if (method != null) { 
     method.Invoke(instance, null); 
    } 
} 
관련 문제