2009-06-23 8 views
5

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.?

Respuesta

6

¿Estás pensando en cancelar eventos? El marco lo usa ampliamente.

Cree una clase EventArgs que tenga una propiedad Cancel que implemente get/set. El controlador de eventos puede establecer la propiedad Cancel en true, que puede verificar cuando regrese la llamada.

public bool TrySomething() 
{ 
    CancelEventArgs e = new CancelEventArgs(); 
    if (Event1 != null) Event1.Invoke(e); 
    if (e.Cancel == false) 
    { 
     if (Event2 != null) Event2.Invoke(e); 
    } 
} 
+0

Mis raíces Java (naming) me vuelven a ser una desventaja. Esto es exactamente lo que estaba buscando. –

Cuestiones relacionadas