Хранение списка методов в C # - PullRequest
       13

Хранение списка методов в C #

17 голосов
/ 22 сентября 2010

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

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

Ответы [ 5 ]

35 голосов
/ 22 сентября 2010

Вы можете определить 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();
7 голосов
/ 22 сентября 2010

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

var queue = new Queue<Action>();

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

while(queue.Count != 0)
{
    Action action = queue.Dequeue();
    action();
}
3 голосов
/ 22 сентября 2010

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

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

0 голосов
/ 22 сентября 2010

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

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

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

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

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

0 голосов
/ 22 сентября 2010

Я бы посоветовал взглянуть на Шаблон команды .Надеюсь, это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...