Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对常规约束进行分组?_C#_Generics - Fatal编程技术网

C# 如何对常规约束进行分组?

C# 如何对常规约束进行分组?,c#,generics,C#,Generics,我试图为泛型方法指定约束组,但我不确定这在C#中是否可行。如果是的话,我就很难理解语法。目前我有以下几点: public TOut GetResponse<TOut, TIn>(TIn message) where TOut : BaseMessageResponse where TIn : BaseMessageRequest public TOut GetResponse(TIn消息) where TOut:BaseMessageResponse where-

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

public TOut GetResponse<TOut, TIn>(TIn message)
    where TOut : BaseMessageResponse
    where TIn  : BaseMessageRequest
public TOut GetResponse(TIn消息)
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 TOut GetResponse(TIn消息)
(其中TOut:Derived1响应
其中锡:Derived1请求)
(其中TOut:Derived2响应
其中锡:Derived2Request)
这是可以在单个方法定义中完成的吗

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

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

public Derived2Response GetResponse(Derived2Request request)
{
    return GetResponse<Derived2Response, Derived2Request>(request);
}
public-Derived1Response-GetResponse(Derived1Request请求)
{
返回GetResponse(请求);
}
公共派生2响应GetResponse(派生2请求请求)
{
返回GetResponse(请求);
}

但是,这会使代码膨胀,这违背了使用泛型的初衷。

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

e、 g

公共myClass
where TOut:BaseMessageResponse
where-TIn:BaseMessageRequest
{
公众兜售回应(TIn)
{
...
}
}
然后使用:

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

另一方面,当您限制类型时,为什么要指定类型(或者为什么它们需要特定)?这可能是这里真正的问题。@CSharpie这是因为我使用的API。请求和响应对象的所有属性都由第三方定义,并在JSON之间进行序列化。对于特定的请求对象,我希望接收特定的响应对象。这就是为什么我想限制他们成对。如果我有不同的结构,这将工作。但是,我有一个父类,它存储连接和身份验证信息,因此不需要为每个调用指定它。这仍然允许这样的重用,但粒度比我想要的要大。由于我选择的设计,我最终使用了我在问题中最初描述的替代方案,这是针对每个单独的对或请求/响应类型的离散方法。然而,由于你的回答也是一个可接受的解决方案(只是不是在我的具体情况下),我接受你的。
var derived1Processing = new myClass<Derived1Response, Derived1Request>();
var derived2Processing = new myClass<Derived2Response, Derived2Request>();