2017-07-31 2 views
0

EventAggregatorをUnityとPRISMで使用すると、特定のイベントに対するサブスクライバのリストを取得する方法はありますか?EventAggregator - サブスクライバのリストを取得

「なぜこれを知りたいのですが、EventAggregatorを使用することのポイントは、誰が何人または何人の加入者を気にしないか」ということです。

これは純粋に私が実行したいエクササイズで、特定の目的ではありません。

EventAggregatorはこのリストを公開する方法があるのですか?

答えて

0

はい、サブスクライバ情報はEventAggregatorオブジェクトグラフに含まれています。残念ながら(ご要望に応じて)、この情報はプライベートフィールドに保存されています。

イベントはプライベートDictionary<Type, EventBase> eventsに格納されます。サブスクリプション情報を取得するため

private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>(); 

一つの選択肢は、(反射許可が存在すると仮定した場合)のプライベートメンバ変数にアクセスするためにリフレクションを使用することであると。サブスクリプションは、(EventBaseで)イベント自体の中に保存されています

EventBaseprotected ICollection<IEventSubscription> 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>データを必要としない場合(単にサブスクリプションの数を知りたいなど)は、あなたが特定のキャストを避けることができます:

public class MyEvent : PubSubEvent<MyEventData> 
{ 
    public new ICollection<IEventSubscription> Subscriptions => base.Subscriptions; 
} 

は、その後、あなたがイベントを照会することができますIEventSubscriptionインターフェイスを使用します。