Существует ли стандартный способ реализации «вето»? - PullRequest
5 голосов
/ 24 июня 2009

Я использую события как часть игровой модели, и для расширения и кодирования «местности» мне нужно иметь возможность наложить вето на большинство действий.

Более четко, почти каждый метод, который имеет побочный эффект, принимает эту форму:

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?

Ответы [ 2 ]

6 голосов
/ 24 июня 2009

Думаете ли вы об отменяемых событиях? Фреймворк использует это широко.

Создайте класс EventArgs, который имеет свойство Cancel, которое реализует get / set. Затем обработчик события может установить для свойства 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);
    }
}
5 голосов
/ 24 июня 2009

Посмотрите на классы CancelEventHandler и CancelEventArgs . Они следуют шаблону, в котором каждый обработчик события может отменить событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...