2010-01-25 4 views

Répondre

2

Vous ne pouvez pas vraiment interroger la valeur actuelle du délégué de l'événement, sauf dans le code qui définit l'événement. Quelle est votre intention ici? Normalement, vous ne devriez pas être trop concerné (nécessairement) avec d'autres abonnés? Il ya des façons de pirater passé l'encapsulation à trouver la valeur actuelle, mais ils sont pas recommandé (ce n'est tout simplement pas une bonne idée). Si votre problème est de savoir si vous gérez déjà cet événement avec ce gestionnaire (c'est-à-dire que vous ne voulez pas vous abonner en double, vous pouvez toujours soit: corriger le code pour qu'il ne le fasse pas, ou b: tricher (C# exemple):

// remove handler **if subscribed**, then re-subscribe 
myWindow.Closed -= MyWindow_Closed; 
myWindow.Closed += MyWindow_Closed; 

pour obtenir la liste d'appel est ... fragile mais faisable Dans les cas simples, vous pouvez simplement utiliser la réflexion pour obtenir le champ, et accrocher la valeur.. Mais avec les formulaires, il utilise des techniques parcimonieuses (pour minimiser l'espace pour les événements sans abonnés). via EVENT_FORMCLOSED.

Il serait plus logique avec un exemple (C#, désolé):

Form form = new Form(); 
    form.FormClosed += delegate { Console.WriteLine("a");}; // just something, anything 
    form.FormClosed += delegate { Console.WriteLine("b");}; // just something, anything 
    object key = typeof(Form).GetField("EVENT_FORMCLOSED", 
     BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); 
    EventHandlerList events = (EventHandlerList) 
     typeof(Component).GetProperty("Events", 
     BindingFlags.NonPublic | BindingFlags.Instance).GetValue(form, null); 
    FormClosedEventHandler handler = (FormClosedEventHandler)events[key]; 
    foreach (FormClosedEventHandler subhandler in handler.GetInvocationList()) 
    { 
     subhandler(form, null); // access the two events separately 
    } 

Dans le cas d'un ObservableCollection<T>, le délégué est directement sur un terrain, il faut donc moins indirection:

ObservableCollection<SomeType> list = ... 
NotifyCollectionChangedEventHandler handler = (NotifyCollectionChangedEventHandler) 
    list.GetType() 
    .GetField("CollectionChanged", BindingFlags.Instance | BindingFlags.NonPublic) 
    .GetValue(list); 
+0

J'ai réellement besoin de déclencher le GetInvocationList à partir de l'événement, une solution de contournement? – Shimmy

+0

@Shimmy - mise à jour de la réponse. –

+0

Dans mon cas, j'ai besoin d'obtenir la liste d'invocation de l'événement INotifyCollectionChanged.CollectionChanged :( Je me bats mal avec elle – Shimmy

Questions connexes