C#多方法附加到事件,如何处理返回值?

时间:2009-12-07 21:26:32

标签: .net events c#-2.0

这是电话:

    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);。如何让事件返回每个方法或处理所有返回值以做出决定?

4 个答案:

答案 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委托。