代码之家  ›  专栏  ›  技术社区  ›  J Moss

C#-试图为不同的处理程序返回泛型类型T

  •  0
  • J Moss  · 技术社区  · 3 年前

    球门

    1. 在Program.cs中,我调用不同的命令处理程序,但希望它们返回 CustomerResponse<T> -因此每个命令处理程序都可以为类型T返回自己的类型

    客户响应:

    public class CustomerResponse<T>
    {
        public T Response { get; set; } // so other handlers can return their own response
    }
    

    ICommandHandler:

    public interface ICommandHandler
    {
        CustomerRespone<T> Handle<T>(T details);
    }
    

    命令处理程序:

    public interface CustomerCommandHandler : ICommandHandler
    {
        // injecting our service in ctor
    
        public CustomerResponse<T> Handle<T>(T details)
        {
            // result is of type CustomerResponse<Operation> but we can't return directly
            // because it can't be implicitly casted to CustomerResult<T>
            var result = _customerService.CustomerOperation(details);
            
            // doesn't do what i expect it to do at runtime
            return (CustomerResponse<T>)(object)result;
        }
    }
    

    程序.cs:

    var result = _customerHandler.Handle(CustomerDetails details);
    

    问题:

    • 程序.cs中的结果类型为 CustomerDetails
    • 所以我会得到一个类型的铸造错误 CustomerResponse<Operation> CustomerResponse<CustomerDetails>
    • 我们想回来 客户响应<操作>

    这样我们就可以有多个处理程序,它们可以返回自己的CustomerResponse

    1 回复  |  直到 3 年前
        1
  •  -1
  •   Georg    3 年前

    您的界面 ICommandHandler 只指定了一件事:每当你放入某种类型的东西时 T ,您得到的响应类型为 CustomerReponse<T> 。如果您的实施想要接受 CustomerDetails 对象并创建 CustomerResponse<Operation> ,它无法实现此接口。

    对我来说,返回类型似乎确实取决于您实际执行的命令的类型,因此,您不能将单个接口创建为保护伞。要执行后者,您必须使用更通用的命令模式。