请原谅我的措辞,我对其中的一些概念还不是很有经验。但是,有没有一种方法(在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)
}
}
听起来委托不是你要找的答案,因为它们可能以未知的顺序执行。
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还没有被调用。