Я уже задавал здесь подобный вопрос, но теперь есть пример.
Делаю я CQRS, есть у меня QueryHandler, в упрощенном виде он выглядит так:
interface IQueryHandler<in Q, out V> {
V Handle(Q query);
}
Теперь у меня есть плагины, которые предоставляют разные обработчики^
interface IPlugin {
IEnumerable<IQueryHandler<???, object>> QueryHandlers { get; }
}
in Q позволяет кастовать только к типам ниже по иерархии, что логично. Как я должен объявлять подобный функционал? Что можно сделать кроме выставления наружу IEnumerable<object>? Естественно предполагается что у разных QueryHandler параметр Q не имеет ничего общего.