我在XNA中为我的游戏创建了一个控制台,并且在输入命令时有一个委托.目前代表返回bool值.我在Console类中声明了一个事件(返回false),然后从其他类中订阅了这个事件.这个想法是,如果没有订阅此事件的类返回true,则假定用户输入了无效命令.但是,如果至少有一个订阅类返回true,则假定该命令有效.
目前,只有一个类被考虑用于返回true或false,有没有办法可以查看所有订阅类的返回值,然后是OR结果?
谢谢,
解决方法
在声明事件的类中,您可以检索事件的调用列表(假设类似字段的事件).单独调用每个订阅者将允许您检查每个订阅者对该事件的返回值.
例如:
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); }
在这个例子中,每个用户都被告知事件 – 如果他们中的任何一个做出肯定的回应,就不会发生短路.如果需要,可以通过删除对ToList()的调用来轻松更改此行为.
说实话,我并不喜欢能够回归价值的事件;他们的语义对订阅者来说并不明显.如果可能的话,我会改变设计.