2010-09-22 9 views
17

Ho un elenco di metodi che vorrei chiamare in un ordine specifico. Pertanto vorrei memorizzarli in una lista ordinata o in una tabella con un indice specificato. In questo modo la lista sarebbe l'unica cosa da cambiare il giorno in cui vogliamo cambiare l'ordine delle chiamate.Memorizzazione di un elenco di metodi in C#

Ho trovato this article spiegando come farlo utilizzando un array e delegati. Ma ho letto nei commenti e in altri posti che potrebbe essere fatto anche usando un dizionario e/o LinQ. Qualche consiglio?

risposta

34

È possibile definire gli oggetti Action, che sono delegati senza parametri che restituiscono void. Ogni azione è un puntatore a un metodo.

// Declare the list 
List<Action> actions = new List<Action>(); 

// Add two delegates to the list that point to 'SomeMethod' and 'SomeMethod2' 
actions.Add(()=> SomeClass.SomeMethod(param1)); 
actions.Add(()=> OtherClass.SomeMethod2()); 

// Later on, you can walk through these pointers 
foreach(var action in actions) 
    // And execute the method 
    action.Invoke(); 
+13

È possibile omettere Invoke() btw, basta chiamare action() – testalino

+1

Tutto è ok ma la coda è molto più adatta per l'attività dell'OP piuttosto che per Elenco, imo. Non è vero? – abatishchev

+2

Non la penso così. È solo un elenco statico, non è necessario eseguire operazioni di accodamento o dequeue, poiché non cambieranno in modo dinamico. Potrebbe voler ri-eseguire il batch un paio di volte, ecc. –

3

Perché non utilizzare un Queue è FIFO, i delegati di negozi in Queue e quando si chiama Dequeue chiamerà i vostri metodi in modo specifico.

Per quanto riguarda l'utilizzo di Multicast Delegate, memorizza i delegati in una LinkList, quindi quando si chiama Invoke(), verrà chiamato in un modo specificato.

7

Che ne dici di un Queue<Action>?

var queue = new Queue<Action>(); 

queue.Enqueue(() => foo()); 
queue.Enqueue(() => bar()); 

while(queue.Count != 0) 
{ 
    Action action = queue.Dequeue(); 
    action(); 
} 
0

Si potrebbe utilizzare List<> che misura il vostro bisogno abbastanza bene:

delegate void MyFunction(...); 
List<MyFunction> delegateList; 

Se il delegato restituisce void, è possibile utilizzare event. È possibile aggiungere più delegati a un singolo elenco di chiamata di eventi e verranno chiamati nell'ordine in cui sono stati aggiunti.

Dictionaryorder is undefined ed è destinata a fare una ricerca.

Problemi correlati