В моем приложении я создаю простой хаб событий, который предлагает что-то для регистрирующих абонентов:Должен ли я поддерживать Co/Contravariance для Pub-/Sub-Scenarios в C# 3.0?
Subscribes<EventType>(ISubscriber<EventType> subscriber)
// and some other methods for adding subscribers
И для публикации событий.
Publish<EventType>(EventType @event)
Довольно просто. Я хочу направить Publish<int>(0)
всем подписчикам, использующим ISubscriber<int>
.
Что не так сложно, что я хочу, чтобы подписчики EventType были контравариантными. Поэтому ISubscriber<object>
должен в основном потреблять все. Я не хочу, чтобы они тоже потребляли ценности.
С # 4, что нет проблем, но сейчас я делаю это вещество с C# 3 и просто притворяюсь контравариация с интерфейсом:
public interface IContravariantGenerics {
object AsVariantFor(Type[] genericParamters);
}
Ну вот, теперь, я хочу Empack данных в «типы событий», подобные этому. Общие параметры этих событий должны быть ковариантными.
SubX : ISubscriber<DataChanged<A>>
DataChanged<T>
T Data {get;}
Когда я опубликовать Publish<DataChanged<B>>(new DataChanged<B>(new B())
(с учетом B: А), Абонент должен быть уведомлен с DataChanged<A>
где данные В-экземпляр передается DataChanged<B>
. Поэтому мне нужна ковариантная поддержка.
Я думал о написании LIB, который поддерживает как СО-/и контрвариацию так:
IMyObject<T1, T2> : IWithVariance<In, Out>
который позволил бы преобразования (не бросает!), Как это:
Obj<Fruit, Fruit> x;
IMyObject<Apple, object> x2 = x.ToVariant<Apple, object>();
Что вас думать? Является ли это возможным? Мысль о том, чтобы делать это с помощью динамических прокси.
Правильно, я должен был бы принимать вещи здесь и там. В случае неоднозначности мне пришлось бы бросать исключения. –