简体   繁体   English

C# 将对象转换为通用接口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM