Estoy usando eventos como parte de un modelo de juego, y para la extensibilidad y el código de "localidad", necesito poder vetar la mayoría de las acciones.¿Existe una forma estándar de implementar eventos "Vetoable"?
Más claramente, casi cada método que tiene un efecto secundario toma esta forma:
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;
}
Lo que me gustaría es para TryingToDoSomething (...) para poder indicar que un acontecimiento registrado objetos de controlador (a través de return false, modificando un parámetro out, o algo así). Por lo que el código es moralmente equivalente a:
/*
* 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;
}
¿Hay una manera aceptada o estándar de hacer esto en C#/.NET.?
Mis raíces Java (naming) me vuelven a ser una desventaja. Esto es exactamente lo que estaba buscando. –