我正在实现一个Buthon_Click方法,顾名思义它正在用一个事件onclick button.Now为了这个方法做我想要的事情我需要清除/取消绑定/取消订阅附加到{{1的委托问题是我想要这样做而不关心以前连接过哪种方法。 举个例子:
SystemEvents.SessionSwitch
所以我现在正在做的是创造一个foreach并经历所有可能性 - 整体上4个:
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(Methodx);
我发现这段代码的安静有点麻烦和尴尬,我想知道是否有一种更“优雅”的方式来做这样的事情,如int [] array={1,2,3,4};
foreach (int n in array)
{
SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch1);
SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch2);
SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch3);
SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch4);
}
或类似的东西会消灭所有连接的方法?
提前致谢
答案 0 :(得分:2)
这取决于谁“拥有”SystemEvents.SessionSwitch
。通常,从外部您无法设置事件处理程序列表 - 您只能添加或删除它们。这就是封装的程度。
您应该区分事件和可能恰好是事件的后备存储的任何变量。事件仅支持订阅和删除。有关详细信息,请参阅我的article on events and delegates。
请注意,您现有的代码可能会更加整洁:
foreach (int n in array)
{
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch1;
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch2;
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch3;
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch4;
}
...虽然你在这里没有使用n
,但是你为什么要循环却不是很清楚。
答案 1 :(得分:0)
除了代表之外设置事件的一个特征(除其他外)是对 + =和 - =仅限于外人的限制。如果您不拥有该事件,则不能对除此之外的事件执行任何其他操作。
拥有该事件的班级可以做:
SystemEvents.SessionSwitch==null; // only allowable to the owner of SessionSwitch