为委托和事件创建字典
本文关键字:创建 字典 事件 | 更新日期: 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
}
}
但不幸的是,方法RaiseCreateClickEvent或RaiseCreateHoverEvent(类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