2008-09-25 39 views
6

我想創建一個要執行的方法列表。每種方法都有相同的簽名。 我想過把代表在泛型集合,但我不斷收到此錯誤:我可以使用列表<T>作爲方法指針的集合嗎? (C#)

'method' is a 'variable' but is used like a 'method'

從理論上講,這裏是我想要做什麼:

List<object> methodsToExecute; 

int Add(int x, int y) 
{ return x+y; } 

int Subtract(int x, int y) 
{ return x-y; } 

delegate int BinaryOp(int x, int y); 

methodsToExecute.add(new BinaryOp(add)); 
methodsToExecute.add(new BinaryOp(subtract)); 

foreach(object method in methodsToExecute) 
{ 
    method(1,2); 
} 

就如何完成任何想法這個? 謝謝!

回答

15

您需要在列表中投的objectBinaryOp,或更好,使用更具體的類型參數列表:(?或3.5)

delegate int BinaryOp(int x, int y); 

List<BinaryOp> methodsToExecute = new List<BinaryOp>(); 

methodsToExecute.add(Add); 
methodsToExecute.add(Subtract); 

foreach(BinaryOp method in methodsToExecute) 
{ 
    method(1,2); 
} 
0

把它們都實現通用接口,說IExecuteable,然後有一個列表< IExecutable>

另外,使用委託:

class Example 
{ 
    public delegate int AddDelegate(int x, int y); 

    public List<AddDelegate> methods = new List<AddDelegate>(); 

    int Execute() 
    { 
     int sum = 0; 
     foreach(AddDelegate method in methods) 
     { 
      sum+=method.Invoke(1, 2); 
     } 
     return sum; 
    } 
} 
0

有沒有使用列表<行動嘗試過,但< t >> type應該可以做到。

3

使用.NET 3.0,你有通用與會代表。

試試這個:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>(); 

methodsToExecute.Add(Subtract); 

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2) 
+0

不應該最後一行是: methodsToExecute [0](1,2); 甚至是beeter: int n = methodsToExecute [0](1,2); – 2008-09-25 21:00:21

2
List<Func<int, int, int>> n = new List<Func<int, int, int>>(); 
      n.Add((x, y) => x + y); 
      n.Add((x, y) => x - y); 
      n.ForEach(f => f.Invoke(1, 2)); 
1

我喜歡Khoth的實現更好,但我認爲是什麼原因造成你的編譯器錯誤是,你不投方法到BinaryOp嘗試調用它。在你的foreach循環中,它僅僅是一個「對象」。改變你的foreach看起來像Khoth的,我認爲它會起作用。

1

每當我試圖做這樣的事情時,我發現重新設計使用命令模式通常會更好,尤其是因爲所有的方法都有相同的參數。這種方式允許更多的靈活性。

相關問題