c#事件——基于字符串引发特定的事件
本文关键字:事件 字符串 | 更新日期: 2023-09-27 17:50:45
我正在编写一个类来处理具有字符串值的单个事件的事件,并将它们映射到并根据字符串值引发特定事件。
使用
这样的开关都可以正常工作SpecificHandler handler = null;
SpecificArgs args = new SpecificArgs(Id, Name);
switch (IncomingEventName)
{
case "EVENT1":
handler = Event1Handler;
break;
case "EVENT2":
handler = Event2Handler;
break;
... etc
}
if (handler != null) handler(this, args);
但是开关列表可以得到太长了,所以我想要一种方式,所以映射字符串事件到处理程序的数据结构(例如KeyValuePair的列表),所以我可以找到字符串事件的项目,并引发相关的事件。
欢迎有任何建议或想法。
谢谢
你可以直接使用字典。但是,要注意不要针对委托,而是针对它们的惰性评估。因此,委托是不可变的,因此您不会收到任何事件处理程序,否则
private static Dictionary<string, Func<Yourtype, SpecificHandler>> dict = ...
dict.Add("Foo", x => x.FooHappened);
dict.Add("Bar", x => x.BarHappened);
,并像这样使用:
Func<SpecificHandler> handlerFunc;
SpecificArgs args = new SpecificArgs(...);
if (dict.TryGetValue(IncomingEventName, out handlerFunc))
{
SpecificHandler handler = handlerFunc(this);
if (handler != null) handler(this, args);
}
以事件名称为键,以事件处理程序为值初始化一个字典,这样就可以方便地访问事件处理程序了。
//初始化字典
Dictionary<string,EventHandler> dic=new Dictionary<string, EventHandler>();
dic["EVENT1"] = Event1Handler;
,用下面的代码
代替switch case if (dic.ContainsKey(IncomingEventName))
{
var handler = dic[IncomingEventName];
if (handler != null) handler(this, args);
}