2017-07-31 59 views
0

在Unity和PRISM中使用EventAggregator,有没有办法将订阅者列表获取到特定事件?EventAggregator - 获取订阅者列表

我知道有些人会说:“为什么你想知道这一点,使用EventAggregator的全部意义在于让我们不关心谁或多少订阅者”。

这纯粹是一个练习,我想执行它并不是为了任何特定的目的。

EventAggregator必须存储订阅者列表有没有办法公开这个列表?

回答

0

是的,订户信息包含在EventAggregator对象图中。不幸的是(对于您的请求),这些信息存储在私人领域。

活动存储在私人Dictionary<Type, EventBase> events。订阅作为一个

private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>(); 

一个选项检索订阅信息存储的事件本身(EventBase)内是使用反射来访问私有成员变量(假设反射允许存在)。

如果您可以修改事件,则另一个选项是通过特定的PubSub<EventBase>公开此信息,因为EventBase允许通过protected ICollection<IEventSubscription> Subscriptions属性访问子类的订阅。例如:

public class MyEvent : PubSubEvent<MyEventData> 
{ 
    public new ICollection<IEventSubscription> Subscriptions => base.Subscriptions; 
} 

然后你就可以查询事件:

var myEvent = eventAggregator.GetEvent<MyEvent>(); 
var sub = (EventSubscription<MyEventData>) myEvent.Subscriptions.FirstOrDefault(); 
MethodInfo method = sub.Action.Method; 
object target = sub.Action.Target; 

如果您不需要特定EventSubscription<T>数据(例如只是想知道订阅数),那么你可以避开具体的投并使用IEventSubscription接口。

相关问题