2011-11-16 52 views
20

我希望能夠將各種靜態方法存儲在列表中,稍後查找並動態調用它們。動態函數列表並動態調用它們

中的每一個靜態方法有指定參數時,類型的不同數量和返回值

static int X(int,int).... 
static string Y(int,int,string) 

我想有一個名單,我可以將它們都添加到:

List<dynamic> list 

list.Add(X); 
list.Add(Y); 

和後來:

dynamic result = list[0](1,2); 
dynamic result2 = list[1](5,10,"hello") 

如何在C#4中做到這一點?

+2

+1,一個不同類型的問題。 –

+0

+1,我喜歡那個 – Dennis

+1

你要找的是[command pattern](http://en.wikipedia.org/wiki/Command_pattern)。谷歌,與'C#'一起,你應該被設置。 –

回答

20

您可以爲每種方法使用適當的委託類型來創建委託實例列表。

var list = new List<dynamic> 
      { 
       new Func<int, int, int> (X), 
       new Func<int, int, string, string> (Y) 
      }; 

dynamic result = list[0](1, 2); // like X(1, 2) 
dynamic result2 = list[1](5, 10, "hello") // like Y(5, 10, "hello") 
+2

+1,以獲得更好的答案。 –

+0

謝謝,這種技術完美無缺! –

3

你其實並不需要的dynamic力量在這裏,你可以用簡單的List<object>做:

class Program 
{ 
    static int f(int x) { return x + 1; } 
    static void g(int x, int y) { Console.WriteLine("hallo"); } 
    static void Main(string[] args) 
    { 
     List<object> l = new List<object>(); 
     l.Add((Func<int, int>)f); 
     l.Add((Action<int, int>)g); 
     int r = ((Func<int, int>)l[0])(5); 
     ((Action<int, int>)l[1])(0, 0); 
    } 
} 

(當然,你需要打石膏,但是你需要以某種方式知道的簽名無論如何,每個存儲的方法)

2
List<dynamic> list = new List<dynamic>(); 
     Action<int, int> myFunc = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     Action<int, int> myFunc2 = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     list.Add(myFunc); 
     list.Add(myFunc2); 

     (list[0])(5, 6);