C#事件-基于字符串引发特定事件

C#事件-基于字符串引发特定事件,c#,events,C#,Events,我正在编写一个类来处理带有字符串值的单个事件中出现的事件,并将它们映射到字符串值,并根据字符串值引发特定事件 这一切都可以很好地与开关,如 SpecificHandler handler = null; SpecificArgs args = new SpecificArgs(Id, Name); switch (IncomingEventName) { case "EVENT1": handler = Event1Handler; break;

我正在编写一个类来处理带有字符串值的单个事件中出现的事件,并将它们映射到字符串值,并根据字符串值引发特定事件

这一切都可以很好地与开关,如

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

欢迎提供任何建议/想法


谢谢

初始化一个字典,将事件名称作为键,将事件处理程序作为值。然后您可以轻松访问事件处理程序

//初始化字典

     Dictionary<string,EventHandler> dic=new Dictionary<string, EventHandler>();
     dic["EVENT1"] = Event1Handler;

你可以用字典。但是,请注意不要以代理为目标,而是对其进行惰性评估。作为一个原因,委托是不可变的,因此您不会收到任何事件处理程序,否则

private static Dictionary<string, Func<Yourtype, SpecificHandler>> dict = ...
dict.Add("Foo", x => x.FooHappened);
dict.Add("Bar", x => x.BarHappened);
专用静态字典dict=。。。
dict.Add(“Foo”,x=>x.Foo);
dict.Add(“Bar”,x=>x.Bar);
然后像这样使用它:

Func<SpecificHandler> handlerFunc;
SpecificArgs args = new SpecificArgs(...);
if (dict.TryGetValue(IncomingEventName, out handlerFunc))
{
    SpecificHandler handler = handlerFunc(this);
    if (handler != null) handler(this, args);
}
Func handlerFunc;
SpecificArgs args=新的SpecificArgs(…);
if(dict.TryGetValue(IncomingEventName,out handlerFunc))
{
SpecificHandler=handlerFunc(此);
if(handler!=null)handler(this,args);
}

是否需要引发不同的事件?您可以将字符串作为
EventArgs
的一部分传递吗?Daniel-谢谢,但是这个中间类的目的是通过创建更有意义的事件名称将字符串隐藏到客户端。我没有测试它,但是由于委托实例是不可变的,基本上,您可以硬连接到将委托添加到字典时出现的事件处理程序。考虑到您可能很早就想这么做(在对象或类型构造函数中),您的字典可能是空的。同意Georg的说法。我尝试过这一点,当我跨过这一步时,他们都像这样,并且在早期的尝试中受到了代表不可改变的性质的影响。我试过这个。。。私有静态字典dict=新字典(); ... dict.Add(“EVENT1”,x=>x.Event1Handler);但是,当添加到对象字典时,我遇到了一个语法错误,因为该字典不包含Event1Handler的定义,并且Event1Handler没有将对象作为其第一个参数的扩展方法。@GeoffKell我假设您在编译时就知道这些事件。在这种情况下,我创建了这个占位符Yourtype,以便您可以导航到所需的事件。如果至少可以对每个事件执行此操作,则可以将强制转换添加到字典中的func中。否则,您将需要使用reflection.Georg访问事件。我犯了一个愚蠢的错误—在我纠正错误后,您最初的建议起了作用。非常感谢。代码现在看起来干净多了:)
Func<SpecificHandler> handlerFunc;
SpecificArgs args = new SpecificArgs(...);
if (dict.TryGetValue(IncomingEventName, out handlerFunc))
{
    SpecificHandler handler = handlerFunc(this);
    if (handler != null) handler(this, args);
}