2008-10-24 4 views

Antwort

17

Sie können nicht. Ereignisse geben nur "add a handler" und "remove a handler" aus - das ist alles. (In der CLR können Sie auch Metadaten haben, um eine Methode mit "fire the event" zu verknüpfen, aber der C# -Compiler generiert das nie.) Einige Publisher bieten möglicherweise zusätzliche Mittel an, um zu überprüfen, ob es Abonnenten gibt oder nicht Sie sehen diese Abonnenten), aber es ist nicht Teil des Ereignismusters selbst.

Weitere Informationen finden Sie unter my article about events, oder sehen Sie sich das Tag events an (das ich dieser Frage hinzufügen möchte).

1

Warum brauchen Sie das? Was ist der Kontext? Vielleicht gibt es einen besseren Weg, um das Ergebnis zu erreichen
Die Schaltfläche ist ein externes Objekt und was Sie versuchen zu überprüfen ist seine interne Liste der Abonnenten, ohne es zu fragen. Es verletzt die Kapselung.
Sie sollten immer das Objekt verwalten die Abonnenten für die Ereignisse, die es ausgesetzt ist. Wenn es den Clients bewusst sein sollte, hätte es eine Methode HasClientsRegistered verfügbar gemacht. Brechen Sie nicht ein.

0

Ich denke, Sie können, wenn Sie in der Klasse sind, die das Ereignis auslöst.

Sie können den Handler definieren und jeweils aufzählen.

z.B. Wenn Ihre Veranstaltung als

event System.EventHandler NewEvent; 

dann auf der Ereigniserhöhungs-Methode definiert wird, könnten erstellen Sie Sie tun können ...

EventHandler handler = NewEvent; 
    if(handler != null) 
    { 
     handler(this, e); 
    } 

Das gibt Ihnen die Handler und von diesem können Sie die Invocation Liste erhalten .

+0

Um zu überprüfen, ob es irgendwelche Abonnenten gibt, brauchen Sie nur "if (NewEvent! = Null)" - aber dies wird nicht wirklich von dem Ereignis erhalten, es wird es aus dem Hintergrundfeld bekommen. Meine Antwort geht davon aus, dass das OP an anderen Ereignissen interessiert ist, wenn man das Beispiel "button.Click" betrachtet. –

0

Ereignisbeschreibung e = TypeDescriptor.GetEvents (yourObject) .Find ("yourEventName", true);