在声明事件的类中,您可以检索事件的调用列表(假设类似字段的事件).单独调用每个订阅者将允许您检查每个订阅者对该事件的返回值.
例如:
public event Func<bool> MyEvent = delegate { return false; };
...
private bool EmitMyEventAndReturnIfAnySubscriberReturnsTrue()
{
return MyEvent.GetInvocationList()
.Cast<Func<bool>>()
.Select(method => method())
.ToList() //Warning: Has side-effects
.Any(ret => ret);
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,每个用户都被告知事件 - 如果他们中的任何一个做出肯定的回应,就不会发生短路.如果需要,可以通过删除对此的调用轻松更改此行为ToList().
说实话,我并不喜欢能够回归价值的事件; 他们的语义对订阅者来说并不明显.如果可能的话,我会改变设计.
编辑:根据Timwi的评论强制完全执行序列的错误.
当我提出这个问题时我就明白了:P
bool handled = false;
foreach (Delegate d in CommandProcessed.GetInvocationList())
handled |= (bool) d.DynamicInvoke (gameTime, command.ToString());
if (!handled) { } // Command Unrecognized
Run Code Online (Sandbox Code Playgroud)
其中 CommandProcessed 是我的类订阅的事件。
我的委托有两个参数:游戏时间和命令字符串。
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |