我可能误解了这里的一些基本概念,因为我是这些概念的新手,所以请多多包涵。
我目前正在从这样的事件中删除方法:
scheduleView.TouchDown -= scheduleView_TouchDown;
然后在其他场合 - 添加方法:
scheduleView.TouchDown += scheduleView_TouchDown;
到目前为止一切正常,我可以理解可以添加多种方法,如下所示:
scheduleView.TouchDown += scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_AnotherTouchDownEventHandler;
但是我之后如何检查连接到此事件的方法是什么?
最佳答案
有趣的是,您不能(至少,从外面看)。 事件
仅有义务提供 2 个访问器 - add
和 remove
。 CLI 规范中定义了其他访问器方法,但它们未在 C# 或其他任何地方 AFAIK 中使用。关键点:我们不能询问 event
订阅了什么(事实上,我们不需要知道)。您所能做的就是:添加
或删除
。
如果您担心重复订阅,请注意,如果您尝试取消订阅但实际上并未订阅,那么在每个理智的实现下,这只是一个空操作;这意味着您可以:
// make sure we are subscribed once but **only** once
scheduleView.TouchDown -= scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_TouchDown;
从引发事件
的代码的角度来看,您很少需要知道谁 - 只需:
// note I'm assuming a "field-like event" implementation here; otherwise,
// change this to refer to the backing-field, or the delegate from the
// event-handler-list
var handler = TouchDown;
if(handler != null) handler(this, EventArgs.Empty); // or similar
还有一种方法可以将委托(delegate)列表分解为单个订阅者,但很少需要:
var handler = TouchDown;
if(handler != null) {
foreach(EventHandler subscriber in handler.GetInvocationList()) {
subscriber(this, EventArgs.Empty);
}
}
主要用途是:
- 当您想对每个订阅者执行异常处理时
- 当委托(delegate)返回值或更改状态时,您需要针对每个订阅者进行处理
关于c# - 检查现有的 'wired up' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9499933/