这是电话:
bool isValid = true;
if (this.ExternalConstraint != null)
{
isValid &= this.ExternalConstraint(this, EventArgs.Empty);
}
if (isValid)
{
//...
}
事件如下:
public delegate bool externalConstraint(object sender, EventArgs args);
event externalConstraint ExternalConstraint;
调试时我注意到调用了附加到事件的所有方法,但只有最后一个返回似乎返回到这一行:isValid &= this.ExternalConstraint(this, EventArgs.Empty);
。如何让事件返回每个方法或处理所有返回值以做出决定?
答案 0 :(得分:6)
您可以在委托上使用Delegate.GetInvocationList
并单独处理返回值。
答案 1 :(得分:4)
在使用事件时依赖返回值被认为是不好的做法。相反,您应该使用用户定义的EventArgs
来获取结果。
public class ConstraintEventArgs : EventArgs
{
public bool IsValid { get; set; }
}
实现一些多个事件侦听器不会覆盖彼此的值的机制也很重要。大多数情况下(使用布尔标志),我们将允许(或鼓励)用户仅明确地将其打开(从不关闭)。
例如,对于CancelEventArgs
,明确地将其设置为false
绝不是一个好主意;用户应始终将其设置为true
或不执行任何操作。同样的想法应该适用IsValid
。
答案 2 :(得分:3)
使用添加返回代码的方法创建自定义EventArgs类。然后,每个侦听器都可以调用该方法,并在事件完成后,您可以遍历返回代码。这也允许您添加有关哪个侦听器返回的数据或原因。
private class MyEventArgs : EventArgs {
public void addReturnCode(bool retCode){
//...
}
public IList<bool> getReturnCodes(){
//...
}
}
答案 3 :(得分:1)
您将迭代来自ExternalConstraint。GetInvocationList的结果,而不是仅仅调用Constraint委托。