使用事件订阅者 "覆盖 "事件调用者的方法

问题描述 投票:0回答:1

请原谅我的措辞,我对其中的一些概念还不是很有经验。但是,有没有一种方法(在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)
    } 

}
c# events event-handling return break
1个回答
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

在第2个例子中,I2已经决定短路,而I3还没有被调用。

© www.soinside.com 2019 - 2024. All rights reserved.