我正在尝试使用事件来使用漂亮的+ = - =语法。
这是我的问题: 我有很多不同的事件,所以我不想创建很多事件,而是只使用一个, 注册人还提供了一个额外的参数(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而且不值得。
如果不可能,有什么方法可以定义+ = - =我自己吗?
答案 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" });