C#自定义事件根据参数分配给不同的代理

时间:2009-09-07 11:51:52

标签: c# events

我正在尝试使用事件来使用漂亮的+ = - =语法。

这是我的问题: 我有很多不同的事件,所以我不想创建很多事件,而是只使用一个, 注册人还提供了一个额外的参数(string []),详细说明了一个人想要听的(子)事件。

这基本上就是我现在正在做的事情:

public delegate void dMethod(int index);
private Dictionary<string, dMethod> events;
public void RegisterEvents(dMethod m, string[] subEvents){
    foreach(string subEvent : subEvents){
        events[subEvent] += m;
    }
}

相反,我想做这样的事情:

public delegate void dMethod(int index);
private Dictionary<string, dMethod> events;

public event dMethod Events(string[] subEvents) {
 add {
        foreach(string subEvent : subEvents){
            events[subEvent] += value;
        }
 }
 remove {
        foreach(string subEvent : subEvents){
            events[subEvent] -= value;
        }
 }
}

是否有可能在事件注册时以某种方式传递其他参数? 我想到的最简单的解决方案是使用委托返回值(将其更改为string [])。 但这只是hacky而且不值得。

如果不可能,有什么方法可以定义+ = - =我自己吗?

3 个答案:

答案 0 :(得分:2)

为什么你不想在每个...事件中使用一个事件?

你要做的是添加间接步骤(会损害性能),更重要的是否认编译时错误检测和代码分析的优势(如果你的字符串怎么办?与现有事件不匹配?在编译时而不是运行时找出错误不是很好吗?“查找所有引用”工具怎么样?)

如果您的所有事件都是单独的事件(彼此无关),则应创建这些事件。为各种事物创建一个单独的事件有点像创建一个包含255列的大型SQL表而不是真正的数据库设计。

另一方面,您可能能够找到所有这些事件的抽象,并将参数添加到事件处理程序(而不是订阅逻辑),指定已经存在的子事件调用。有关此技术的示例,请参阅IBindingList。请注意使用枚举而不是字符串来避免拼写错误。

你能给我们一些关于你正在进行的事件的例子(商业方面的)吗?

答案 1 :(得分:1)

  

我想到的最简单的解决方案是   使用委托返回值   (将其改为字符串[])。

我不太明白你的意思。事件处理程序是否会返回它想要处理的事件?

我不认为你想要做的是一个选择。有可能(如果放弃.Net事件系统)通过创建自定义类和一些隐式转换运算符来使用+ =语法来生成类似的代码:

SomePropertyThatIsntARealEvent[new string[] {"event1", "event2"}] += someDelegate
// or even
SomePropertyThatIsntARealEvent["event1"]["event2"] += someDelegate

请注意,如果它甚至可行,那将是混乱和hacky并且不管怎么说都不值得。此外,遗憾的是,您不能将params用于索引器。

我建议您坚持使用非常漂亮的方式。

答案 2 :(得分:0)

这不是您主要问题的答案,但为了方便使用,我会在您的方法中添加“params”关键字,如下所示:

public void RegisterEvents(dMethod m, params string[] subEvents)

这将让你调用这样的方法:

RegisterEvents(m, "Bob", "Doug", "Susie");

而不是:

RegisterEvents(m, new string[] { "Bob", "Doug", "Susie" });