我多次发现,由于某种原因(例如,表单设计器中的复制和粘贴),分配给表单某些组件的事件处理程序丢失,即事件没有连接到表单代码中的正确函数。
我想从表单代码或某个单元测试中检查这一点:至少确保它们不为空,或者检查它们是否连接到正确的事件处理程序。
我已经看到了关于这方面的问题,但我无法通过错误The event 'SomeEvent' can only appear on the left hand side of += or -=
。当试图将其与null进行比较时,或者甚至正如其他一些答案所建议的那样,获取代表列表,然后检查这些代表时,就会发生这种情况。
我不想把事情搞砸。相反,我想确保它们在我的单元测试中被正确设置。
例如,手动将事件处理程序订阅到构造函数中组件的事件对我来说似乎是个坏主意。它们应该已经在InitializeComponent()
代码中订阅了。。。检查他们是否订阅正是我想要解决的问题。
我要检查的事件处理程序不是在Form本身中定义的,也就是说,它们不是我的事件处理,而是Form或某些组件的事件处理。例如,我有一个窗体的KeyDown事件处理程序,用于检查一些快捷方式。尝试获取此类偶数处理程序的InvocationList会导致上面的错误。
我尽量不让设计器将事件绑定到代码,我更喜欢在我的构造函数中编写它,如果我想将它们分组到,则调用"WireEvents()"方法
不管怎样,如果我理解了你的问题,你可以迭代事件处理程序附加的委托
任何事件处理程序/事件处理程序<>有一个方法GetInvocationList(),它返回附加事件委托的列表,因此您可以使用它来执行检查
你可以迭代做一些类似的事情
if(YourEvent!=null){
foreach (var @delegate in YourEvent.GetInvocationList()){
//do your job
}
}
更新:这里有另一个答案的链接,可以解决您无法调用GetInvocationList的问题:https://stackoverflow.com/a/12476529/1716620