2008-09-25 22 views
6

Chcę utworzyć listę metod do wykonania. Każda metoda ma ten sam podpis. Myślałem o oddanie delegatów w kolekcji generycznych, ale wciąż otrzymuję ten błąd:Czy mogę użyć listy <T> jako kolekcji wskaźników metod? (C#)

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

w teorii, tutaj jest to, co chciałbym zrobić:

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

pomysłów, w jaki sposób osiągnąć to? Dzięki!

Odpowiedz

15

Trzeba rzucić object w liście do BinaryOp, lub lepiej użyć bardziej konkretny parametr typu do listy: (? Lub 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

je wszystkie wdrożenia wspólnego interfejsu, powiedzmy IExecuteable, a następnie mieć listę < IExecutable>

Ponadto, za pomocą delegatów:

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

nie próbowałem, ale za pomocą listy < Akcja < t >> typ powinien być w stanie to zrobić.

3

Korzystanie .NET 3.0 masz generic delegaci.

Spróbuj tego:

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

Nie powinna to być ostatnia linia: methodsToExecute [0] (1,2); lub nawet 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

Lubię realizację Khoth jest lepiej, ale myślę, że to, co jest przyczyną błędu jest to, że kompilator nie rzucają metody do BinaryOp zanim spróbujesz go wywołać. W pętli foreach jest to tylko "obiekt". Zmień foreach, aby wyglądał jak Khoth i myślę, że to zadziała.

1

Ilekroć miałem ochotę zrobić coś takiego, stwierdziłem, że ogólnie lepiej jest refaktoryzować swój projekt, aby użyć wzorca polecenia, zwłaszcza, że ​​wszystkie twoje metody mają te same parametry. W ten sposób można uzyskać znacznie większą elastyczność.