为委托和事件创建字典

本文关键字:创建 字典 事件 | 更新日期: 2023-09-27 18:15:33

我想创建一个这样的字典:

public class MyClass
{
public delegate void CreateClickEvent(string value);
public event CreateClickEvent OnCreateClick;
public delegate void CreateHoverEvent(string value);
public event CreateHoverEvent OnCreateHover;
private Dictionary<string,Delegate> _myDictionary = null;
public MyClass()
{
    _myDictionary = new Dictionary<string,Delegate>();
    _myDictionary.Add("Click", OnCreateClick);
    _myDictionary.Add("Hover", OnCreateHover);
}
public void Call(string name)
{
    Delegate action;
    if (_myDictionary.TryGetValue(name, out action))
    {
        if (action != null)
            action.DynamicInvoke( "something" );
        else
            Console.WriteLine("null");
    } 
    else
        Console.WriteLine("Couldn't find action");
}
}
public class Tester()
{
    public Tester()
    {
        MyClass MyClass = new MyClass();
    myClass.OnCreateClick += RaiseCreateClickEvent;
    myClass.OnCreateHover += RaiseCreateHoverEvent;
}
public void RaiseCreateClickEvent(string value)
{
    ///do it here
}
public void RaiseCreateHoverEvent(string value)
{
    ///do it here
}
}

但不幸的是,方法RaiseCreateClickEventRaiseCreateHoverEvent(类Tester)不是从调用方法(类MyClass)。它没有给出任何错误,动作变量显示为空,并打印

我在这里做错了什么?

为委托和事件创建字典

您有委托的字典,但是它在创建字典时保留事件的。在这一点,两个OnCreateXXXX都是null

作为一个选项,可以使用Action的字典并在每个动作中调用事件,因此动作将使用事件的当前值,而不是初始值:

  private Dictionary<string,Action<string>> _myDictionary = 
       new Dictionary<string,Action<string>>();
         _myDictionary.Add("Click", s => OnCreateClick(s));
         _myDictionary.Add("Hover", s => OnCreateHover(s));

和使用:

  _myDictionary["Click"] ("sometext");

注意代表的良好阅读(特别是+/+=的影响值)是可用的http://csharpindepth.com/Articles/Chapter2/Events.aspx