[英]C# Cast Object to Generic Interface
I am trying to create CQRS in my small project and I need to cast object to Interface that has generic parameter.我正在尝试在我的小项目中创建 CQRS,我需要将对象转换为具有通用参数的接口。
edit: typo fixed编辑:错别字已修复
NewUsersIdsMessageHandler newUserHandler = new NewUsersIdsMessageHandler();
IMessageHandler<IMessage> handler = newUserHandler; // compilation error
public class NewUsersIdsMessage : IMessage
{
public NewUsersTroopRequestIdsMessage()
{
}
}
public class NewUsersIdsMessageHandler : IMessageHandler<NewUsersIdsMessage >
{
public NewUsersIdsMessageHandler()
{
}
}
public interface IMessageHandler<in TType>
where TType : IMessage
{
Task<bool> Handle(TType message);
}
How can I assign ?我该如何分配?
IMessageHandler<IMessage> handler = new NewUsersIdsMessageHandler();
I know that I can assign我知道我可以分配
IMessageHandler<NewUsersIdsMessage> handler = new NewUsersIdsMessageHandler();
but that is not universal enough for me.但这对我来说还不够普遍。 Thanks!
谢谢!
It is impossible.是不可能的。
This interface这个界面
public interface IMessageHandler<out TType> where TType : IMessage
{
bool Handle(TType Message);
}
cannot have <out TType>
specification, since TType acts as an input parameter.不能有
<out TType>
规范,因为 TType 作为输入参数。
While having <out TType>
specification is required to be able to assign like this:虽然需要
<out TType>
规范才能像这样分配:
IMessageHandler<IMessage> handler = newUserHandler;
This is called covariance and contravariance .这称为协方差和逆变。
Logically thinking: IMessageHandler<IMessage>
can handle any type of message, while newUserHandle
can handle only specific messages, so this assignment cannot go through static type-check at compile-time, as it might cause runtime error.逻辑思维:
IMessageHandler<IMessage>
可以处理任何类型的消息,而newUserHandle
只能处理特定的消息,所以这个赋值不能在编译时进行静态类型检查,因为它可能会导致运行时错误。
In case the ultimate goal is to be able to find the appropriate handler for given message type, you can use IoC containers, eg Autofac;如果最终目标是能够为给定的消息类型找到合适的处理程序,您可以使用 IoC 容器,例如 Autofac; Here is how it will help you:
以下是它如何帮助您:
builder
.Register(typeof(NewUsersIdsMessageHandler))
.As(typeof(IMessageHandler<NewUsersIdsMessage>))
.InstancePerDependency();
Then in code然后在代码中
var handler = container.Resolve<IMessageHandler<NewUserIdsMessage>>()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.