2008-10-24 8 views

Répondre

17

Vous ne pouvez pas. Les événements exposent simplement "ajouter un gestionnaire" et "supprimer un gestionnaire" - c'est tout. (En fait, dans le CLR vous pouvez aussi avoir des métadonnées pour associer une méthode avec "fire the event" mais le compilateur C# ne génère jamais cela.) Certains éditeurs d'événements peuvent offrir des moyens supplémentaires pour vérifier s'il y a des abonnés vous voyez ces abonnés) mais cela ne fait pas partie du modèle d'événement lui-même. Pour plus d'informations, reportez-vous à my article about events ou consultez la balise events (que je suis sur le point d'ajouter à cette question).

1

Pourquoi avez-vous besoin de cela? Quel est le contexte? Peut-être qu'il y a une meilleure façon d'atteindre le résultat
Le bouton est un objet externe et ce que vous essayez de faire est de vérifier sa liste interne d'abonnés sans le demander. Il viole l'encapsulation.
Vous devez toujours laisser l'objet gérer les abonnés pour les événements qu'il expose. S'il voulait que les clients soient au courant, il aurait exposé une méthode HasClientsRegistered. Ne pas entrer par effraction.

0

Je pense que vous pouvez si vous êtes dans la classe qui soulève l'événement.

Vous pouvez définir le gestionnaire et énumérer chacun d'entre eux.

par exemple. Si votre événement est défini comme

event System.EventHandler NewEvent; 

ensuite sur la méthode d'événement raise vous pourriez vous créer pouvez faire ...

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

Cela vous donnera le gestionnaire et de ce que vous pouvez obtenir la liste d'appel .

+0

Pour vérifier s'il y a des abonnés, vous avez juste besoin de "if (NewEvent! = Null)" - mais cela ne l'obtient pas vraiment de l'événement, il l'obtient depuis le champ de sauvegarde. Ma réponse suppose que l'OP s'intéresse à d'autres événements, vu l'exemple "button.Click". –

0

EventDescriptor e = TypeDescriptor.GetEvents (votreObjet) .Find ("yourEventName", true);