2014-05-02 8 views
14

Sto provando a creare un elenco che contenga metodi, e dopo aver aggiunto alcuni metodi che voglio eseguirli, è possibile?Come creare un elenco di metodi quindi eseguirli?

Ho provato qualcosa di simile:

List<object> methods = new List<object>(); 

Poi:

methods.Add(Move()); 

ma quando aggiungo, il programma richiamerà i metodi, per esempio, in questo caso si chiama per Move();

risposta

20

Questo è un grande caso d'uso per la Action delegato generico.

List<Action> functions = new List<Action>(); 
functions.Add(Move); 

foreach (Action func in functions) 
    func(); 

Se avete bisogno di parametri, vorrei utilizzare lambda a loro astrarre:

List<Action> functions = new List<Action>(); 
functions.Add(Move); 
functions.Add(() => MoveTo(1, 5)); 

foreach (Action func in functions) 
    func(); 

Un delegato è simile a puntatori a funzione da C++, che detiene ciò che una funzione di "è" (non un ritorno valore come nel tuo esempio) così puoi chiamarlo come una normale funzione. Il delegato generico di Action non accetta parametri e non restituisce nulla, quindi è ideale per il generico "chiama queste funzioni".

MSDN per l'azione: Action Delegate

+0

Grazie !! Il suo lavoro bene ora (: – user3491915

+0

sta facendo un '' lista necessario Sembra come la semplice definizione 'azione yourFunction,' e aggiungendo il? metodi per farlo funziona con '+ =' loro, così come 'yourFunction + = DoThis; yourFunction + = DoThat;'. L'unico difetto è che non sono abbastanza sicuro di come lo itera internamente, quindi se hai bisogno di quel livello di controllo una lista può essere più appropriata – bigp

+0

@bigp Puoi farlo perché tutti i delegati sono multicast, personalmente mi piace essere esplicito qui, se voglio usare + = userò semplicemente un evento. Come dici tu, è fondamentalmente uno stile cosa però – BradleyDotNET

1

È possibile utilizzare i delegati. Creare un elenco di delegati. Quindi, per ciascun metodo che si desidera aggiungere all'elenco, creare un delegato e aggiungerlo all'elenco.

List<Delegate> methods = new List<Delegate>(); 

// creates an Action delegate implicitly 
methods.Add((Action)Move); 
+0

Grazie per l'attenzione (: – user3491915

Problemi correlati