在Unity和PRISM中使用EventAggregator,有沒有辦法將訂閱者列表獲取到特定事件?EventAggregator - 獲取訂閱者列表
我知道有些人會說:「爲什麼你想知道這一點,使用EventAggregator的全部意義在於讓我們不關心誰或多少訂閱者」。
這純粹是一個練習,我想執行它並不是爲了任何特定的目的。
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
接口。