是否有一个很好的策略可以在运行时将多个事件的接收者(假设一个对象实例A)交换到另一个实例B(或多个实例)?例如,想一个菜单栏,其中包含一系列可以在当前选定的多个对象上执行的操作。
现在一个选项是将所有对象的处理程序连接到单击事件,让处理程序过滤掉相关的调用(通过检查,如果选择了当前实例)或注册/取消注册事件选择。
另一种方法是将事件注册到像这样的代理对象(粗略代码):
class ClickEventProxy
{
private static ClickEventProxy selectedInstance; // <-- changend on selection
public event EventHandler SomeEventToForward;
public static void RaiseSomeEventToForward(object sender, EventArgs e)
{
if (selectedInstance.ClickedAddNewFrame != null)
selectedInstance.ClickedAddNewFrame(sender, e);
}
...
}
发件人网站看起来像SomeSource.Click += ClickEventProxy.RaiseSomeEventToForward;
,所有收件人都会订阅他们的代理实例。
然而,处理实例(例如通过全局<object, proxy instance>
字典)有点不方便,整个事情看起来有点笨拙。所以我的问题是:有更多的程序化方法吗?或者通过引入另一个步骤来代理事件本身是不好的做法,而应该删除并读取处理程序? (也许这可以通过使用自定义事件和更改调用列表来改善...)