2014-07-20 3 views
0

Я хочу иметь словарь событий, до сих пор у меня естьКак сделать словарь событий?

private Dictionary<T, event Action> dictionaryOfEvents; 

можно ли сделать что-то вроде этого?

+1

словарь событий и что? –

+0

Будут ли методы или вызовы, которые вы хотите сохранить? – TaW

+0

Пожалуйста, объясните, почему вы считаете, что вам нужна коллекция событий. Это позволит нам помочь вам решить вашу проблему, а не отвечать на технические вопросы. –

ответ

6

У вас не может быть словаря событий, хотя вы можете иметь словарь делегатов.

private Dictionary<int, YourDelegate> delegates = new Dictionary<int, YourDelegate>(); 

где YourDelegate может быть любым типом делегата.

+0

Я сделаю это, но я буду использовать List как часть значения словаря, чтобы иметь несколько дескрипторов для каждого ключа. –

+3

@IanHern Нет необходимости использовать 'List ' просто 'YourDelegate' достаточно [делегаты могут быть объединены] (http://msdn.microsoft.com/en-IN/library/ms173175.aspx) –

+0

Пока это истинно, что делегаты могут быть объединены/добавлены, как только они будут вызваны вместе; это может быть только то, что хочется, но, возможно, это не так. Если доступ к ним свободно желателен, то, возможно, List или даже второй, внутренний словарь может найти правильное решение. – TaW

2

Событие - это не тип, но действие есть. Так, например, вы можете написать:

private void button1_Click(object sender, EventArgs e) 
{ 
    // declaration 
    Dictionary<string, Action> dictionaryOfEvents = new Dictionary<string, Action>(); 

    // test data 
    dictionaryOfEvents.Add("Test1", delegate() { testMe1(); }); 
    dictionaryOfEvents.Add("Test2", delegate() { testMe2(); }); 
    dictionaryOfEvents.Add("Test3", delegate() { button2_Click(button2, null); }); 

    // usage 1 
    foreach(string a in dictionaryOfEvents.Keys) 
    { Console.Write("Calling " + a + ":"); dictionaryOfEvents[a]();} 

    // usage 2 
    foreach(Action a in dictionaryOfEvents.Values) a(); 

    // usage 3 
    dictionaryOfEvents["test2"](); 

} 

void testMe1() { Console.WriteLine("One for the Money"); }   
void testMe2() { Console.WriteLine("One More for the Road"); } 
Смежные вопросы