在Unity和PRISM中使用EventAggregator,有没有办法获取特定事件的订阅者列表?
我知道有些人会说"为什么你想知道这一点,使用EventAggregator的全部意义在于我们不关心谁或多少订阅者#。 / p>
这纯粹是我想要执行的练习,不是出于任何特定目的。
EventAggregator必须存储订阅者列表是否有办法公开此列表?
答案 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
接口进行特定转换。