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的列表),所以我可以找到字符串事件的项目,并引发相关的事件。

欢迎有任何建议或想法。

谢谢

c#事件——基于字符串引发特定的事件

你可以直接使用字典。但是,要注意不要针对委托,而是针对它们的惰性评估。因此,委托是不可变的,因此您不会收到任何事件处理程序,否则

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);
            }