私のアプリケーションでは、サブスクライバーを登録するための何かを提供する単純なイベント ハブを作成しています。
Subscribes<EventType>(ISubscriber<EventType> subscriber)
// and some other methods for adding subscribers
そして出版イベント。
Publish<EventType>(EventType @event)
とてもシンプルです。Publish<int>(0)
を実装しているすべてのサブスクライバーにルーティングしたいISubscriber<int>
。
それほど難しくないのは、サブスクライバーの EventType を反変にすることです。したがって、ISubscriber<object>
基本的にすべてを消費する必要があります。値型も消費してほしいかどうかはわかりません。
C#4 では問題ありませんが、今は C#3 でこのようなことを行っており、インターフェイスで反変性を偽装しています。
public interface IContravariantGenerics {
object AsVariantFor(Type[] genericParamters);
}
さて、このように「イベント型」にデータを詰め込みたいと思います。そのイベントのジェネリック パラメーターは、共変でなければなりません。
SubX : ISubscriber<DataChanged<A>>
DataChanged<T>
T Data {get;}
パブリッシュするとPublish<DataChanged<B>>(new DataChanged<B>(new B())
(指定された B : A)、Subscriber にはDataChanged<A>
、データがどこに渡された B インスタンスであるかが通知されますDataChanged<B>
。したがって、共分散のサポートも必要です。
次のように、Co-/And Contravariance の両方をサポートするライブラリを作成することを考えました。
IMyObject<T1, T2> : IWithVariance<In, Out>
次のような変換(キャストではありません!)が可能になります:
Obj<Fruit, Fruit> x;
IMyObject<Apple, object> x2 = x.ToVariant<Apple, object>();
どう思いますか?出来ますか?動的プロキシを使用してそれを行うことを考えました。