c#"OR"事件委托返回bool

Dav*_*ave 6 .net c# events xna delegates

我在XNA中为我的游戏创建了一个控制台,并且在输入命令时有一个委托.目前代表返回bool值.我在Console类中声明了一个事件(返回false),然后从其他类中订阅了这个事件.这个想法是,如果没有订阅此事件的类返回true,则假定用户输入了无效命令.但是,如果至少有一个订阅类返回true,则假定该命令有效.

目前,只有一个类被考虑用于返回true或false,有没有办法可以查看所有订阅类的返回值,然后是OR结果?

谢谢,

Ani*_*Ani 6

在声明事件的类中,您可以检索事件的调用列表(假设类似字段的事件).单独调用每个订阅者将允许您检查每个订阅者对该事件的返回值.

例如:

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的评论强制完全执行序列的错误.

  • 我不会想到为此使用LINQ.很好的答案. (2认同)

Dav*_*ave 3

当我提出这个问题时我就明白了: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 是我的类订阅的事件。
我的委托有两个参数:游戏时间和命令字符串。