2010-09-10 3 views
2

Voici ce que je travaille avec:C#: Créer un événement qui est déclenché à chaque fois qu'un autre événement qui a des auditeurs est déclenché, dynamiquement par réflexion peut-être?

Une partie de mon projet est une application sous forme de fenêtre. Je veux essentiellement capturer chaque événement qui déclenche et a des auditeurs. Donc, l'événement click d'un bouton, l'événement check checkbox, tout sur une liste d'évènements de base "Control". Donc, cet événement se déclenche toujours, mais aussi déclenche mon événement. Y a-t-il un événement générique "un événement déclenché" sous le capot que je peux exploiter, ou est-il possible d'utiliser la réflexion pour énumérer tous les objets de ma forme, analyser tous les événements, analyser ceux qui ont des écouteurs et puis abonnez-vous tous à un événement générique ailleurs en plus de l'endroit où ils vont déjà?

Quelqu'un sait-il comment faire?

+1

Mais pourquoi avez-vous besoin de faire cela .. Peut-être que vous voudrez peut-être poser une question sur une résolution des problèmes qui vous conduisent à cette approche?. – Regent

+0

ressemble un peu à des événements routés, comme dans WPF. Est-ce exact? Ou Bubbling .. –

+0

D'accord, il serait facile de le faire dans WPF mais dans une forme de victoire pas vraiment sûr de la façon dont vous l'accomplissez sans vous abonner à tous les événements. – Mark

Répondre

4

Vous ne pouvez fondamentalement pas faire cela: un événement est une boîte noire avec juste "subscribe" et "désabonnement" fonctionnalité. Ainsi, alors que vous pouvez utiliser la réflexion pour découvrir tous les événements, vous ne pouvez pas détecter de manière fiable les éléments auxquels vous avez souscrit. Pour les événements comme le terrain, vous pouvez chercher le champ de support et vérifier si oui ou non il est nul, mais même ce n'est pas fiable - pour éviter les contrôles nuls, l'auteur peut avoir écrit quelque chose comme ceci:

public event EventHandler SomeEvent = delegate {}; 

Pour d'autres événements, vous devrez déterminer ce que l'abonnement à l'événement fait réellement - par exemple, il peut utiliser EventHandlerList. Fondamentalement, vous devez repenser votre conception de sorte que vous n'avez pas besoin de le faire.

+0

ok, eh bien c'était une pensée. :) Je voulais faire un fichier journal automatique, comme "Trace" mais sans écrire explicitement à la trace. – Nick

0

Le fait qu'un événement souscrit ait été déclenché n'indique-t-il pas qu'il a un (des) abonné (s)? Ainsi, tout ce dont vous avez besoin est une liste d'événements pouvant être souscrits, sur lesquels vous pouvez valider pendant un intercepted call.

Vous pouvez intercepter un appel en utilisant n'importe quel cadre AOP. Par exemple, en utilisant Unity Interception, vous pouvez faire quelque chose comme ceci:

public IMethodReturn Invoke(IMethodInvocation input, 
    GetNextHandlerDelegate getNext) 
{ 
    // 1. assuming that you are keeping a list of method names 
    // that are being subscribed to. 
    // 2. assuming that if the event is fired, then it must have 
    // been subscribed to... 
    if (MyReflectedListOfSubscribedEvents.Contains(input.MethodBase.ToString()) 
    { 
     HandleItSomeHow(); 
    } 

    // process the call... 
    return getNext().Invoke(input, getNext); 
} 
Questions connexes