如何对常规约束进行分组

本文关键字:约束 常规 | 更新日期: 2023-09-27 18:28:21

我试图将约束指定为泛型方法,但我不确定这在C#中是否可行。如果是的话,我很难弄清楚语法。目前我有以下几种:

public TOut GetResponse<TOut, TIn>(TIn message)
    where TOut : BaseMessageResponse
    where TIn  : BaseMessageRequest

它的功能非常好。然而,我实际上并没有发送或接收基类消息,而是派生了类。我真正想要的是能够声明组,这样我就可以在编译时判断我是否有不匹配的请求和响应类型。所以我想要的是这样的东西:

public TOut GetResponse<TOut, TIn>(TIn message)
    (where TOut : Derived1Response
    where TIn : Derived1Request)
    (where TOut : Derived2Response
    where TIn : Derived2Request)

这是可以在单个方法定义中完成的吗?

还有另一种解决方案,就是为每对请求/响应对象定义一个方法,并让每对对象调用我现在拥有的通用方法,如下所示:

public Derived1Response GetResponse(Derived1Request request)
{
    return GetResponse<Derived1Response, Derived1Request>(request);
}
public Derived2Response GetResponse(Derived2Request request)
{
    return GetResponse<Derived2Response, Derived2Request>(request);
}

然而,这会使代码膨胀,从而违背了从一开始就使用泛型的目的。

如何对常规约束进行分组

如果是我,我会将泛型定义移到类级别,并为不同的请求/响应类型使用单独的实例。

例如

public myClass<TOut, TIn>
    where TOut : BaseMessageResponse
    where TIn  : BaseMessageRequest
{
    public TOut GetResponse(TIn)
    {
        ...
    }
}

然后使用:

var derived1Processing = new myClass<Derived1Response, Derived1Request>();
var derived2Processing = new myClass<Derived2Response, Derived2Request>();