请原谅,我对其中的一些概念还不太了解。但是,是否有一种方法(使用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)
}
}
答案 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未被调用。