Come scrivere una classe EventHandler personalizzata

1

Quando ho iniziato a utilizzare Java, ho creato una classe Event personalizzata per simulare l'implementazione degli eventi di C #. Da allora, ho aggiunto alcune altre funzionalità, come le priorità di listener di eventi e gli eventi a cascata sono stati rispettati. Ora che sto usando di nuovo C #, volevo creare una classe Eventhandler, o almeno una classe con cui posso usare la parola chiave dell'evento, che includesse queste funzionalità. Iniziando con, ho colpito un po 'di un muro di mattoni dove non posso sottoclasse EventHandler, mi è stato detto che è una classe sigillata, e posso usare solo la parola chiave evento con EventHandler / EventHandler e le sue sottoclassi.

È una commissione da scemo? E dovrei limitarmi a una traduzione più diretta della mia classe di eventi, ignorando il sistema degli eventi già sul posto? O c'è un modo per farlo con successo?

    
posta Hanii Puppy 21.11.2014 - 17:03
fonte

2 risposte

1

Non sono sicuro di aver capito la tua domanda, ma con l'introduzione dei generici non hai più bisogno di scrivere un eventhandler personalizzato, ma puoi creare un EventArgs personalizzato ...

public event EventHandler<MyEventArgs> MyEvent;
public class MyEventArgs : EventArgs { //your stuff here }

se hai davvero bisogno di un EventHandler personalizzato puoi scrivere:

public delegate void CustomEventHandler(object sender, MyEventArgs e);
public event CustomEventHandler MyEvent
    
risposta data 21.11.2014 - 17:16
fonte
0

Lascia la parola chiave event anziché

public event SampleEventHandler SampleEvent;

usa solo delegati standard (in C #, i delegati sono abilitati per il multicast). Dichiaralo in questo modo:

delegate void SampleEventHandler(object sender, MyEventArgs e);

Ora, per introdurre le priorità, usa qualcosa come una coda di priorità. Come semplice modulo, puoi utilizzare un dizionario:

Dictionary<int,SampleEventHandler> EventDictionary;

dove le chiavi del dizionario sono le diverse priorità. Questo dizionario funge da "evento" nella classe in cui lo definisci. Per aggiungere qualche nuovo gestore di eventi, hai bisogno di qualcosa di simile:

public void AddNewEvent(int priority,SampleEventHandler handler)
{
     if(!EventDictionary.ContainsKey(priority))
         EventDictionary.Add(priority, null );
     EventDictionary[priority]+=handler;
}

Per aumentare gli eventi in ordine basso-prio-first, hai bisogno di un codice come questo:

foreach(int priority in EventDictionary.Keys.OrderBy(p=>p))
     EventDictionary[priority](this,myEventArgs);
    
risposta data 21.11.2014 - 19:20
fonte

Leggi altre domande sui tag