Oui, les informations sur l'abonné sont contenues dans le graphique d'objet EventAggregator
. Malheureusement (pour votre demande), cette information est stockée dans des champs privés. Les événements sont stockés dans un code confidentiel Dictionary<Type, EventBase> events
. Les abonnements sont stockés dans l'événement lui-même (en EventBase
) comme
private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>();
Une option pour récupérer les informations d'abonnement est d'utiliser la réflexion pour accéder aux variables membres privées (en supposant l'autorisation de réflexion existe).
Si vous pouvez modifier les événements, une autre option consiste à exposer cette information via le PubSub<EventBase>
spécifique puisque EventBase
permet l'accès aux souscriptions pour les sous-classes via la propriété protected ICollection<IEventSubscription> Subscriptions
. Par exemple:
public class MyEvent : PubSubEvent<MyEventData>
{
public new ICollection<IEventSubscription> Subscriptions => base.Subscriptions;
}
Ensuite, vous pouvez interroger l'événement:
var myEvent = eventAggregator.GetEvent<MyEvent>();
var sub = (EventSubscription<MyEventData>) myEvent.Subscriptions.FirstOrDefault();
MethodInfo method = sub.Action.Method;
object target = sub.Action.Target;
Si vous ne avez pas besoin des EventSubscription<T>
données spécifiques (par exemple, veulent juste savoir compte d'abonnement), vous pouvez alors éviter la distribution spécifique et utilisez l'interface IEventSubscription
.