Можно ли использовать открытый универсальный шаблон в качестве аргумента конструктора?

Я создал очень простой издатель событий, и он выглядит так.

public class EventPublisher
{
    private readonly IList<Func<IHandle>> _subscribers;

    public EventPublisher(IList<Func<IHandle>> subscribers)
    {
        _subscribers = subscribers;
    }

    public void Publish<TPayload>(TPayload payload)
        where TPayload : class
    {
        var payloadHandlers = _subscribers.OfType<Func<IHandle<TPayload>>>();

        foreach (var payloadHandler in payloadHandlers)
        {
            payloadHandler().Handle(payload);
        }
    }
}

Вот что я должен публиковать сообщения.

var subscribers = new List<Func<IHandle>> {() => new SomeHandler()};
var eventPublisher = new EventPublisher(subscribers);

eventPublisher.Publish(new SomeMessage { Text = "Some random text..." });

Проблема во мне. При публикации сообщения не обнаруживаются обработчики, которые могут обрабатывать полезную нагрузку. Это имеет смысл, поскольку я зарегистрировал своих подписчиков как Func вместо Func > .

Интерфейс, от которого наследуются мои классы обработчиков, взят из Caliburn.Micro.EventAggregator и выглядит следующим образом.

public interface IHandle {}

public interface IHandle<TMessage> : IHandle {
    void Handle(TMessage message);
}

Какой должен быть тип _subscribers для обработки IHandle <> где универсальным типом может быть любой конкретный тип?

5
задан gcso 17 August 2011 в 13:45
поделиться