Это невозможно.
Этот интерфейс
public interface IMessageHandler<out TType> where TType : IMessage
{
bool Handle(TType Message);
}
не может иметь спецификацию <out TType>
, поскольку TType действует как входной параметр.
При наличии спецификации <out TType>
требуется, чтобы иметь возможность назначать так:
IMessageHandler<IMessage> handler = newUserHandler;
Это называется ковариация и контравариантность .
Логически: IMessageHandler<IMessage>
может обрабатывать сообщения любого типа, в то время как newUserHandle
может обрабатывать только определенные c сообщения, поэтому это назначение не может проверять тип go через stati c во время компиляции, так как это может привести к ошибка времени выполнения.
Если конечная цель состоит в том, чтобы найти подходящий обработчик для данного типа сообщения, вы можете использовать контейнеры Io C, например, Autofac; Вот как это вам поможет:
builder
.Register(typeof(NewUsersIdsMessageHandler))
.As(typeof(IMessageHandler<NewUsersIdsMessage>))
.InstancePerDependency();
Тогда в коде
var handler = container.Resolve<IMessageHandler<NewUserIdsMessage>>()