在我的应用程序中,我正在创建一个简单的事件中心,它为注册订阅者提供了一些东西:
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)时,应通知订阅者DataChanged<A>
Data 是传递给的 B 实例的位置DataChanged<B>
。所以我也需要协方差支持。
我想编写一个支持 Co-/和逆变的库,如下所示:
IMyObject<T1, T2> : IWithVariance<In, Out>
这将允许像这样的转换(不是强制转换!):
Obj<Fruit, Fruit> x;
IMyObject<Apple, object> x2 = x.ToVariant<Apple, object>();
你怎么看?可能吗?考虑使用动态代理来做这件事。