Frage

Ich habe eine Klasse mit einem Ereignisse:

public event MyEventHandler MyEvent;

Gibt es eine Möglichkeit, einen Griff in die Sammlung von Objekten des Erhaltens (durch Reflexion oder auf andere Weise), die zu diesem Ereignis hören?

Bearbeiten - Ähm, leider die Torpfosten bewegen - I Notwendigkeit der Lage sein, dies mit Reflexion zu tun bc ich einen String-Wert repräsentiert den Ereignisnamen, und ich müssen die Zuhörer zu finden. Ich kann keine offensichtliche Möglichkeit des Zugriffs auf die GetInvocationList Eigenschaft mit Reflexion sehen ...

Danke!

War es hilfreich?

Lösung

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

Auf diesem durch Reflexion wird etwas verschleiert werden, wenn überhaupt möglich, leider, da diese Syntax:

public event EventHandler MyEvent;

...

MyEvent(this, EventArgs.Empty);

Ist syntaktischer Zucker. Was dies tatsächlich tut, ist:

private EventHandler compilerGeneratedName;

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

...

compilerGeneratedName(this, EventArgs.Empty);

Mit anderen Worten, Ereignisse haben immer die deklarative Stenografie haben, dass die Eigenschaften erst vor kurzem erhalten. Als Ergebnis, um an der Aufrufliste bekommen Sie die private Variable inspizieren müssen, die vom Compiler genannt wird (es sei denn natürlich, Sie Langschrift sich Syntax und wissen die Namen der Instanzvariablen).

Es gibt keinen direkten Weg, um einen nach außen freigelegt event konstruiert mit einem Träger Handler zu assoziieren mehr als eine direkte Art und Weise ist ein property auf einen Träger variabel zu binden: nämlich weil nicht notwendigerweise ein Eins-zu -on Beziehung . Sehr wahrscheinlich ist, aber in der Regel ist es nicht so sein muß.

Sie können versuchen, mithilfe von Reflektion auf die privaten Variablen zu untersuchen, die von der Art des richtigen EventHandler<> Typ sind, der das Ereignis deklariert (beachten Sie, dass es in der spezifische Art werden zu tun haben, , die erklärt, das Ereignis, nicht auf einer Unterklasse) und sehen, ob Sie irgendeine Art von Korrelation mit den Namen bestimmen können, aber das wird eine unzuverlässige Lösung bestenfalls sein.

Andere Tipps

MulticastDelegate.GetInvocationList()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top