В моем приложении я создаю простой центр событий, который предлагает что-то для регистрации подписчиков:
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 / /, так и Contravariance, вот так:
IMyObject<T1, T2> : IWithVariance<In, Out>
Что позволило бы преобразование (не приведение!), Например:
Obj<Fruit, Fruit> x;
IMyObject<Apple, object> x2 = x.ToVariant<Apple, object>();
Что ты думаешь? Является ли это возможным? Мысль сделать это с помощью динамических прокси.