Вопрос по .net, .net-3.5, c# – Хранение списка методов в C #

17

У меня есть список методов, которые я хотел бы вызвать в определенном порядке. Поэтому я хотел бы хранить их в упорядоченном списке или в таблице с указанным индексом. Таким образом, список будет единственным, что может изменить день, когда мы хотим изменить порядок вызовов.

я нашелЭта статья объясняя, как это сделать, используя массив и делегаты. Но я прочитал в комментариях и некоторых других местах, что это также можно сделать с помощью словаря или LinQ. Любые советы?

Ваш Ответ

5   ответов
7

Как насчетQueue<Action> ?

var queue = new Queue<Action>();

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

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

Вы можете определитьAction объекты, которые являются делегатами без параметров, которые возвращаютvoid, Каждое действие является указателем на метод.

// 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();
Не думай так. Это просто статический список, без необходимости ставить в очередь или удалять задачи, так как они не будут меняться динамически. Возможно, он захочет повторно запустить партию несколько раз и т. Д. Jan Jongboom
Все в порядке, но Queue гораздо больше подходит для задач OP, чем List, imo. Не так ли? abatishchev
Вы можете опустить Invoke (), кстати, просто вызвать action () testalino
3

Queue это FIFO, хранить делегатов вQueue и когда вы звонитеDequeue он будет вызывать ваши методы указанным образом.

Что касается использования Multicast Delegate, он хранит делегаты в LinkList, поэтому, когда вы вызываете Invoke (), он будет вызываться определенным образом.

0

Вы могли бы использоватьList<> который бы подходил под ваши нужды:

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

Если ваш делегат возвращает void, вы можете использоватьevent, Несколько делегатов могут быть добавлены в один список вызовов событий и будут вызываться в порядке их добавления.

delegate void MyEvent(...);
event MyEventEventHandler MyEvent;

Dictionary заказ не определен и он предназначен для поиска.

0

Шаблон команды, Надеюсь, это то, что вы ищете.

Похожие вопросы