2012-06-29 2 views
2

목록에 저장된 메서드 이름으로 메서드를 호출하려고합니다. 누구든지 도와 줄 수 있습니까? 나는 C#에 익숙하다! 전혀 Delegate.DynamicInvoke 필요하지 않습니다처럼Delegate.DynamicInvoke

{ 
    delegate string ConvertsIntToString(int i); 
} 

class Program 
{ 
    public static List<String> states = new List<string>() { "dfd","HiThere"}; 
    static void Main(string[] args) 
    { 
     ConvertsIntToString someMethod = new ConvertsIntToString(states[1]); 
     string message = someMethod(5); 
     Console.WriteLine(message); 
     Console.ReadKey(); 
    } 
    private static string HiThere(int i) 
    { 
     return "Hi there! #" + (i * 100); 
    } 
} 

답변

3

은 같습니다 - 동적를 호출 하려고하지 않는 - 당신은 당신이 Delegate.CreateDelegate와 함께 할 수있는 동적 대리자를 만들 에 노력하고 있습니다. 당신은 당신이 원하는 방법은 다른 유형에있는 경우이를 조정해야 할 분명히

using System; 
using System.Reflection; 

delegate string ConvertsIntToString(int i); 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Obviously this can come from elsewhere 
     string name = "HiThere"; 

     var method = typeof(Program).GetMethod(name, 
               BindingFlags.Static | 
               BindingFlags.NonPublic); 
     var del = (ConvertsIntToString) Delegate.CreateDelegate 
      (typeof(ConvertsIntToString), method); 

     string result = del(5); 
     Console.WriteLine(result); 
    } 

    private static string HiThere(int i) 
    { 
     return "Hi there! #" + (i * 100); 
    } 
} 

, 또는이다 : - 짧지 만 완전한 프로그램 귀하의 예제를 기반으로 (그러나 목록을 사용하지 않고 거기에 대한 필요는 여기에 없습니다) 인스턴스 메서드이거나 public입니다.

+0

왜 그가 직접 호출 할 수있을 때 대리인을 만들어야합니까? – Clueless

+0

@ 희소식 : 우리는 모른다. 그러나 그가 원할 수도있는 많은 이유가있다. 예를 들어, 여러 번 호출하는 경우, 여러 번 리플렉션을 사용하여 호출하는 것보다 한 번 델리게이트를 만드는 것이 훨씬 효율적입니다. 또는 대리인을 수락하는 메서드에 전달하려고 할 수 있습니다. –