2012-06-29 27 views
2

我想通過存儲在列表中的方法名稱來調用方法。誰能幫忙?我是新來的C#!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.DynamicInvoke在所有 - 你不是想動態調用它 - 你想動態創建委託,您可以用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); 
    } 
} 

顯然,你需要調整,如果你想的方法是不同類型的,或者是實例方法,或者是公共的。

+0

他爲什麼要創建一個委託,他可以直接調用它? – Clueless

+0

@無跡:我們不知道,但他可能會想要很多理由。例如,如果他多次調用它,創建委託一次比多次調用反射要高效得多。或者,也許他想將它傳遞給接受委託的方法。 –