2008-09-25 18 views
6

Voglio creare una lista di metodi per eseguire. Ogni metodo ha la stessa firma. Ho pensato di mettere i delegati in una raccolta generica, ma continuo a ricevere questo errore:Posso usare un elenco <T> come una raccolta di puntatori del metodo? (C#)

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

In teoria, ecco quello che vorrei fare:

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

Tutte le idee su come realizzare Questo? Grazie!

risposta

15

è necessario lanciare l'object nell'elenco per un BinaryOp, o, meglio, utilizzare un parametro di tipo più specifico per la lista: (? O 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

averli tutti implementano di interfaccia comune, dire IExecuteable, e poi hanno un elenco < IExecutable>

Inoltre, utilizzando i delegati:

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

non l'ho provato, ma utilizzando un elenco < azione < t >> tipo dovrebbe essere in grado di farlo.

3

Utilizzando .NET 3.0 avete generici delegati.

Prova questo:

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

Non dovrebbe essere ultima riga: methodsToExecute [0] (1,2); o anche 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

mi piace l'implementazione di KHOTH meglio, ma penso che quello che sta causando il vostro errore del compilatore è che non si lanci un metodo per BinaryOp prima di provare a richiamarlo. Nel tuo ciclo foreach è solo un "oggetto". Cambia il tuo foreach per somigliare a quello di Khoth e penso che funzionerebbe.

1

Ogni volta che sono stato tentato di fare qualcosa di simile, ho trovato che è generalmente migliore di refactoring il vostro disegno di utilizzare il modello di comando, tanto più che tutti i metodi hanno gli stessi parametri. In questo modo consente molta più flessibilità.