EventAggregator - 获取订阅者列表

时间:2017-07-31 08:20:18

标签: unity-container prism eventaggregator

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

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

这纯粹是我想要执行的练习,不是出于任何特定目的。

EventAggregator必须存储订阅者列表是否有办法公开此列表?

1 个答案:

答案 0 :(得分:1)

是的,订阅者信息包含在EventAggregator对象图中。不幸的是(根据您的要求),此信息存储在私有字段中。

事件存储在私人Dictionary<Type, EventBase> events中。订阅作为

存储在事件本身(EventBase)中
private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>();

检索订阅信息的一个选项是使用反射来访问私有成员变量(假设存在反射权限)。

如果您可以修改事件,那么另一个选项是通过特定的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接口进行特定转换。