Domanda

Ho una lezione con un evento:

public event MyEventHandler MyEvent;

Esiste un modo per ottenere una maniglia per la raccolta di oggetti (per riflessione o altro) che stanno ascoltando questo evento?

MODIFICA - Uhm, mi dispiace spostare i pali della porta - ho bisogno di poterlo fare usando la riflessione bc Ho un valore di stringa che rappresenta il nome dell'evento, e I bisogno di trovare gli ascoltatori. Non riesco a vedere un modo ovvio di accedere alla proprietà GetInvocationList usando reflection ...

Grazie!

È stato utile?

Soluzione

List<object> targets = MyEvent.GetInvocationList().Select(d => d.Target).ToList();

Fare questo tramite la riflessione sarà un po 'offuscato, se possibile, sfortunatamente, perché questa sintassi:

public event EventHandler MyEvent;

...

MyEvent(this, EventArgs.Empty);

È lo zucchero sintattico. Ciò che effettivamente fa è:

private EventHandler compilerGeneratedName;

public event EventHandler MyEvent
{
    add { compilerGeneratedName += value; }
    remove { compilerGeneratedName -= value; }
}

...

compilerGeneratedName(this, EventArgs.Empty);

In altre parole, gli eventi hanno sempre avuto la stenografia dichiarativa che le proprietà hanno ricevuto solo di recente. Di conseguenza, per accedere all'elenco di invocazioni dovrai ispezionare la variabile privata, che è nominata dal compilatore (a meno che, ovviamente, non usi tu stesso la sintassi longhand e conosci il nome della variabile di istanza).

Non esiste un modo diretto per associare un costrutto event esposto esternamente a un gestore di supporto più di quanto non ci sia un modo diretto per legare un property a una variabile di supporto: vale a dire perché non c'è necessariamente una relazione uno a uno . Molto probabilmente c'è, ma di norma non deve essere così.

Puoi provare a usare reflection per ispezionare le variabili private del tipo EventHandler<> appropriato sul tipo che dichiara l'evento (tieni presente che dovrai farlo nel tipo specifico che dichiara l'evento, non in una sottoclasse) e vede se è possibile determinare una sorta di correlazione con i nomi, ma questa sarà una soluzione inaffidabile nella migliore delle ipotesi.

Altri suggerimenti

MulticastDelegate.GetInvocationList()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top