Хранение делегатов в словаре - PullRequest
2 голосов
/ 13 марта 2019

Я пытаюсь подписать делегатов на мероприятие, проводимое в List<KeyValuePair<KeyEnum, Delegate>

Цель состоит в том, чтобы связать серию обработчиков с клавишами клавиатуры и именованными осями, которые представлены в Enums

Диспетчеризация довольно проста, я просто перебираю список KVP, проверяю условие и, если условие выполняется, вызываю делегата просто с помощью member.Value; Я не столкнулся с какими-либо проблемами с эффективностью во время процессора с этим и на самом деле обнаружили, что в стеке он значительно чище.

Проблема заключается в добавлении делегатов после создания экземпляра. Попытка получить к нему доступ с помощью collection.FirstOrDefault(n=>n.Key == KeyEnum.W).Value+= SomeMethod не работает, так как Value только для чтения.

Есть ли способ сделать это, который не требует создания нового KeyValuePair каждый раз или лучшего решения, чем KeyValuePair в целом

1 Ответ

0 голосов
/ 13 марта 2019

Просто используйте Dictionary<KeyEnum, Action>. Я не понимаю, зачем вам нужен последовательный доступ к KVP. Вы также должны указать тип делегата, соответствующий обработчикам событий, если можете. Action или EventHandler или Action<Something> в зависимости от ваших потребностей.

Тогда вы можете легко добавлять и вызывать делегатов:

// adding delegates
if (dictionary.ContainsKey(KeyEnum.W)) {
    dictionary[KeyEnum.W] += SomeMethod;
} else {
    dictionary.Add(KeyEnum.W, SomeMethod);
}

// calling delegates
if (dictionary.ContainsKey(KeyEnum.W)) {
    dictionary[KeyEnum.W](...);
}
...