使用事件订阅者“替代”事件调用者的方法

时间:2020-06-15 15:34:33

标签: c# events event-handling return break

请原谅,我对其中的一些概念还不太了解。但是,是否有一种方法(使用C#)使用通过事件调用的“委托”,而该委托实际上覆盖了调用事件的地方的方法?

我认为只有一个事件的订阅者时,我才有解决方案。但是,如果要在调用特定订户的方法时要覆盖它,则不会。

在此先感谢您,如果这个问题有点过头,我们深表歉意

//示例伪代码可能会更好地解释问题

class Broadcaster{
  public delegate void myDelegate();
   public event myDelegate myEvent;     


    void foo(){
        if(myEvent != null){
            myEvent();

            **Here is the issue**
            //How can I return here, not for every subscriber
            //but only if a subscriber wants to?
            return;
        }

       //Do Something if a subscriber has not already returned
    }    
}


class Listener(){

    void Start(){
        FindObjectOfType<Broadcaster>().myEvent += OnBroadcasterEvent();

    }

    public void OnBroadcasterEvent(){
        //Do something



        **Here is the issue**
        //Return, or, break from parent method (i.e. where event was called from)
    } 

}

1 个答案:

答案 0 :(得分:1)

听起来好像委托不是您要找的答案,因为委托可能会以未知顺序执行。

ASP.NET处理其管道的方式可能是更好的方法。基本上有一个调用链,链中的每个部分都调用链中的下一个,直到其中一个刚刚返回。

每个“处理程序”都是在链中使用“下一个”处理程序来构造的,然后再“调用”链的头部。

 public class MyHandler
 {
     private Func<MyRequest, MyResult> _next;
     public MyHandler(Func<MyRequest,MyResult> next) => _next = next;

     public MyResult Handle(MyRequest request)
     {
         if(IWantToShortCircuit)
         {
              return request;
         }

         return _next(request);
     }
 }

所以您可以得到这样的链条:

  I1       I1
   |        ^
   v        |
  I2       O2
   |        ^
   v        |
  I3 --->  O3

或者您可以短路

  I1       I1
   |        ^
   v        |
  I2  ---> O2


  I3       O3

在第二个示例中,I2决定短路,而I3未被调用。