我正在使用事件作为游戏模型的一部分,并且为了扩展性和代码“地点性”的缘故,我需要能够否决大多数行为。
更清楚的是,几乎所有具有副作用的方法都采用以下形式:
public event TryingToDoSomethingHandler TryingToDoSomething;
public event SomethingHappenedHandler SomethingHappened;
/*
* Returning true indicates Something happened successfully.
*/
public bool DoSomething(...)
{
//Need a way to indicate "veto" here
TryingToDoSomething(...);
//Actual do it
SomethingHappened(...);
return true;
}
我想要的是TryingToDoSomething(...)能够指示已注册的事件处理程序对象(通过返回false,修改out参数或其他内容)。因此代码在道德上等同于:
/*
* Returning true indicates Something happened successfully.
*/
public bool DoSomethingImproved(...)
{
//Pretty sure multicast delegates don't work this way, but you get the idea
if(!TryingToDoSomething(...)) return false;
//Actual do it
SomethingHappened(...);
return true;
}
在C#/ .NET中有没有可接受的或标准的方法呢?
答案 0 :(得分:6)
你在考虑可取消的事件吗?该框架广泛使用它。
创建一个EventArgs
类,其具有实现get / set的Cancel
属性。然后,事件处理程序可以将Cancel
属性设置为true
,您可以在调用返回时进行检查。
public bool TrySomething()
{
CancelEventArgs e = new CancelEventArgs();
if (Event1 != null) Event1.Invoke(e);
if (e.Cancel == false)
{
if (Event2 != null) Event2.Invoke(e);
}
}
答案 1 :(得分:5)
查看CancelEventHandler和CancelEventArgs课程。它们遵循一种模式,每个事件处理程序都可以取消该事件。