在注册事件绑定事件前检查事件处理程序是否已注册
解决思路,是在事件所属类内部,使用GetInvocationList()方法,来获取已关联的事务,然后进行判断,注意,这个方法在事件类外部不能使用
源码示例:
public void Test(Delegate delegateToTest)
{
if (X.EventX != null)
{
foreach (Delegate existingHandler in X.EventX.GetInvocationList())
{
if (existingHandler == delegateToTest)
{
// registered
}
}
}
}
当然,没什么特殊要求的情况下,简单粗暴的处理方式也可以,就是在绑定事件之前,先解绑一次
objectX.EventX -= HandlerB;
objectX.EventX += HandlerB;