代码之家  ›  专栏  ›  技术社区  ›  Patrick Desjardins

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

  •  1
  • Patrick Desjardins  · 技术社区  · 16 年前

    这是电话:

        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 回复  |  直到 16 年前
        1
  •  4
  •   Bryan Menard    16 年前

    在使用事件时依赖返回值被认为是不好的做法。相反,您应该使用用户定义的 EventArgs 以返回结果。

    public class ConstraintEventArgs : EventArgs
    {
        public bool IsValid { get; set; }
    }
    

    实现一些机制也很重要,在这种机制中,多个事件监听器不会重写彼此的值。大多数时候(带有布尔标志),我们只允许(或鼓励)用户显式地打开它(从不关闭)。

    例如,使用 CancelEventArgs 把它设置为 false 显式;用户应始终将其设置为 true 或者什么也不做。同样的想法也适用于 IsValid .

        2
  •  6
  •   jason    16 年前

    你可以用 Delegate.GetInvocationList 并分别处理返回值。

        3
  •  3
  •   C. Ross trotttrotttrott    16 年前

    使用用于添加返回代码的方法创建自定义EventArgs类。然后,每个侦听器都可以调用该方法,并且在事件完成后,可以迭代返回代码。这还允许您添加关于哪个侦听器返回了什么或为什么返回的数据。

    private class MyEventArgs : EventArgs {
       public void addReturnCode(bool retCode){
           //...
       }
    
       public IList<bool> getReturnCodes(){
           //...
       }
    
    }
    
        4
  •  1
  •   ctacke    16 年前

    您将迭代来自外部约束的结果。 GetInvocationList 而不仅仅是调用约束委托。

    推荐文章