2017-07-31 96 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接口。

相關問題