c# - 检查现有的 'wired up' 方法

标签 c# events methods delegates

我可能误解了这里的一些基本概念,因为我是这些概念的新手,所以请多多包涵。

我目前正在从这样的事件中删除方法:

scheduleView.TouchDown -= scheduleView_TouchDown;

然后在其他场合 - 添加方法:

scheduleView.TouchDown += scheduleView_TouchDown;

到目前为止一切正常,我可以理解可以添加多种方法,如下所示:

scheduleView.TouchDown += scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_AnotherTouchDownEventHandler;

但是我之后如何检查连接到此事件的方法是什么?

最佳答案

有趣的是,您不能(至少,从外面看)。 事件有义务提供 2 个访问器 - addremove。 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/

相关文章:

function - PowerShell 将多个参数传递给类方法失败

C++ 单例与静态方法

c# - C# 中的 function 和 function() 有什么区别?

c# - Convert.ToString() 中的条件表达式评估错误?

c# - 如何正确地将字符串传递给ffmpeg?

php - PDO 事件常量

javascript - dispatchEvent 'mouseover' 不工作

python - 为多个类定义方法

c# - 获取一个 COM 对象以在 C# 中对除 S_OK (0) 以外的任何结果抛出异常

javascript - 替换innerHTML后touchmove事件停止