2010-09-22 18 views
17

Tengo una lista del método que me gustaría llamar en un orden específico. Por lo tanto, me gustaría almacenarlos en una lista ordenada o en una tabla con un índice especificado. De esta forma, la lista sería lo único que cambiaría el día en que queremos cambiar el orden de las llamadas.Almacenar una lista de métodos en C#

Encontré this article explicando cómo hacerlo usando una matriz y delegados. Pero leí en los comentarios y en otros lugares que también podría hacerse usando un Diccionario y/o LinQ. ¿Algún consejo?

Respuesta

34

Puede definir objetos Action, que son delegados sin parámetros que devuelven void. Cada acción es un puntero a un método.

// 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

Puede omitir Invoke() por cierto, solo llame a action() – testalino

+1

Todo está bien, pero Queue es mucho más adecuado para la tarea del OP en lugar de List, imo. ¿No es así? – abatishchev

+2

No lo creo. Es solo una lista estática, no hay necesidad de tareas de cola o dequeueing, ya que no cambiarán dinámicamente. Es posible que desee volver a ejecutar el lote un par de veces, etc. –

3

¿Por qué no considera utilizar un Queue es FIFO, almacena delegados en Queue y cuando llame al Dequeue llamará a sus métodos de una manera específica.

¿Qué pasa con el uso de delegado de multidifusión, almacena delegados en una lista de enlaces, por lo que cuando llame a Invoke(), se llamará de una manera específica.

7

¿Qué tal un Queue<Action>?

var queue = new Queue<Action>(); 

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

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

Usted podría utilizar List<> la que se ajuste a sus necesidades bastante bien:

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

Si su delegado regresa vacía, puede utilizar event. Se pueden agregar múltiples delegados a una sola lista de invocación de eventos y se invocarán en el orden en que se agregaron.

Dictionaryorder is undefined y que está destinado a realizar una búsqueda.

Cuestiones relacionadas