2008-09-25 9 views
6

Tôi muốn tạo danh sách các phương thức để thực thi. Mỗi phương thức có cùng chữ ký. Tôi nghĩ về việc đưa các đại biểu trong một bộ sưu tập chung, nhưng tôi tiếp tục nhận được lỗi này:Tôi có thể sử dụng Danh sách <T> làm bộ sưu tập các con trỏ phương pháp không? (C#)

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

Về lý thuyết, đây là những gì tôi muốn làm:

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); 
} 

Bất kỳ ý tưởng về cách thực hiện điều này? Cảm ơn!

Trả lời

15

Bạn cần phải cast object trong danh sách để một BinaryOp, hoặc tốt hơn là sử dụng một số loại cụ thể hơn cho danh sách: (? Hoặc 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

Có tất cả chúng thực hiện của giao diện phổ biến, nói IExecuteable, và sau đó có một danh sách < IExecutable>

Ngoài ra, sử dụng các đại biểu:

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

đã không thử nó nhưng sử dụng một danh sách < Hành động < t >> loại sẽ có thể thực hiện.

3

Sử dụng .NET 3.0 bạn có chung đại biểu.

Hãy thử điều này:

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

nên không phải là dòng cuối cùng là: methodsToExecute [0] (1,2); hoặc thậm chí beeter: int n = methodsToExecute [0] (1,2); –

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

Tôi thích thực hiện Khoth của tốt hơn nhưng tôi nghĩ rằng những gì đang gây ra lỗi biên dịch của bạn là bạn không đúc phương pháp để một BinaryOp trước khi bạn cố gắng để gọi nó. Trong vòng lặp foreach của bạn nó chỉ đơn thuần là một "đối tượng". Thay đổi foreach của bạn trông giống như Khoth và tôi nghĩ rằng nó sẽ làm việc.

1

Bất cứ khi nào tôi đã bị cám dỗ để làm một cái gì đó như thế này, tôi đã phát hiện ra rằng nó nói chung là tốt hơn để cấu trúc lại thiết kế của bạn để sử dụng các mô hình lệnh, đặc biệt là kể từ khi tất cả các phương pháp của bạn có các thông số tương tự. Bằng cách này, cho phép linh hoạt hơn rất nhiều.