2009-06-23 9 views
5

Uso gli eventi come parte di un modello di gioco e, per motivi di estensibilità e codice "località", devo essere in grado di porre il veto sulla maggior parte delle azioni.Esiste un modo standard per implementare eventi "Vetoable"?

Più chiaramente, quasi ogni metodo che ha un effetto collaterale assume questa 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; 
} 

Quello che mi piacerebbe è per TryingToDoSomething (...) per essere in grado di indicare che un evento registrato oggetti gestore (restituendo false, modificando un parametro out, o qualcosa del genere). In modo che il codice è 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; 
} 

C'è un modo accettato o standard per fare questo in C#/NET.?

risposta

6

Stai pensando ad Eventi annullabili? Il framework usa ampiamente questo.

Creare una classe EventArgs con una proprietà Cancel che implementa get/set. Il gestore eventi può quindi impostare la proprietà Cancel su true, che è possibile verificare quando viene restituita la chiamata.

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

Le mie radici di Java (naming) mi ostacolano ancora una volta. Questo e 'esattamente quello che stavo cercando. –

Problemi correlati