EventAggregator - 获取订阅者列表
问题描述:
在Unity和PRISM中使用EventAggregator,有没有办法将订阅者列表获取到特定事件?EventAggregator - 获取订阅者列表
我知道有些人会说:“为什么你想知道这一点,使用EventAggregator的全部意义在于让我们不关心谁或多少订阅者”。
这纯粹是一个练习,我想执行它并不是为了任何特定的目的。
EventAggregator必须存储订阅者列表有没有办法公开这个列表?
答
是的,订户信息包含在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
接口。