有没有一种标准的方式来实现“Vetoable”事件?

5

我正在使用事件作为游戏模型的一部分,出于可扩展性和代码“局部性”的考虑,我需要能够否决大多数操作。

更明确地说,几乎每个具有副作用的方法都采用以下形式:

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中,是否有一种被认可或标准的方法来实现这个功能?
2个回答

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);
    }
}

我的 Java(命名)底蕴再次成为我的障碍。这正是我正在寻找的。 - Kevin Montrose

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接