Я использую события как часть игровой модели, и для расширения и кодирования «местности» мне нужно иметь возможность наложить вето на большинство действий.
Более четко, почти каждый метод, который имеет побочный эффект, принимает эту форму:
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?