我正在开发一个应用程序,在其中动态分配按钮的事件。现在问题是我希望获取按钮单击事件的所有事件,因为我希望删除以前的处理程序。
我尝试将事件处理程序设置为 null,例如:
Button.Click += null;
但是,我收到了一个运行时异常,无法分配 null。
我想知道已经附加到它的事件,以便我可以删除这些事件。
任何人都可以帮助我实现这一目标吗?
您不能分配事件 - 只有附加 (+=) 和删除 (-=) 操作可用于客户端。
由于 += 和 -= 是在声明事件的类型之外的事件上允许的唯一操作,因此外部代码可以添加和删除事件的处理程序,但不能以任何其他方式获取或修改事件处理程序的底层列表.
一个很好的模式是在Action removeAll
某处声明,所以你可以这样做:
button.Click += handler
removeAll += () => button.Click -= handler
这样,您只需要跟踪一个变量,并且您可以通过调用来清除所有内容removeAll()
,而不是单独跟踪所有处理程序并且必须调用-=
它们中的每一个。如果您有多个子类EventHandler
要处理,这将特别方便,因为否则您必须使用多个列表来跟踪它们。
你不能这样做(幸运的是。想象一下,一些外部代码删除了你的事件处理程序,你的代码只是停止以静默方式工作)。
(反射在这里不是一个选项,因为事件实现可能因类型而异)。通常,如果您想以这种方式删除所有事件处理程序,这意味着设计错误。