Нет такой вещи.Открытый шаблон не может быть статически скомпилирован / связан.Он имеет реальный тип (typeof(IHandle<>)
), но вы можете работать с ним только с помощью отражения.
Лучшее, что вы можете сделать, это сохранить его как object
(или dynamic
в .NET 4)или как общий базовый тип IHandle
, как вы уже сделали, но в любом случае у вас не будет доступа во время компиляции к событию Handle
.Вам придется использовать Reflection или приведение, чтобы вызвать его во время выполнения.
Чтобы связать события в первую очередь, вы можете воспользоваться преимуществами вывода типа в методе ( не конструктор), то есть
public void RegisterHandler(IHandle<TMessage> handler) { ... }
Вызовы метода могут быть написаны без универсального аргумента, если вы передаете действительный универсальный IHandle<TMessage>
в качестве параметра.Вы можете использовать это, чтобы ограничить то, что входит в вашу коллекцию неуниверсальных объектов IHandle
, а затем использовать методы Reflection (в частности, методы GetInterfaces
, GetMethod
и MakeGenericMethod
) для фактического вызова обработчика.Или, как в вашем примере, если вы уже знаете тип события, просто попробуйте выполнить приведение.