gpt4 book ai didi

c# - 有没有标准的方法来实现 "Vetoable"事件?

转载 作者:太空狗 更新时间:2023-10-29 22:25:06 27 4
gpt4 key购买 nike

我将事件用作游戏模型的一部分,为了可扩展性和代码“本地化”,我需要能够否决大多数操作。

更清楚地说,几乎所有有副作用的方法都采用这种形式:

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、修改输出参数等)。因此代码在道德上等同于:

/*
* 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 中是否有公认的或标准的方法来执行此操作?

最佳答案

您是否正在考虑可取消的事件?该框架广泛使用了它。

创建一个 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);
}
}

关于c# - 有没有标准的方法来实现 "Vetoable"事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1035712/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com