C# 方法输入和输出集合中的多个泛型类型
C# multiple generic types in method input and output collection
我有如下所示的通用查询方法
List<T> Query<T>(QueryModel query) where T : BaseClass
{
// get data and Deserialize by T
}
// where T is Table DTO, to Deserialize response by T
现在想实现多查询并行执行
为此,我需要在响应和输入中使用多个类型参数,并希望实现这样的目标:
List<T1, T2, T3> Query<T1, T2, T3>(List<QueryModel> queries)
where T1: BaseClass,
where T2: BaseClass,
where T3: BaseClass
{
// for each query in queries
// get data for each query and
// deserialize each by T1/T2/T3 accordingly
// return all responses in single generic collection
}
在上面的示例中,可以有 3 个查询,每个查询都可以通过相应地提供的类型化参数进行反序列化。
但我相信我们不能有超过一个类型的参数与像 List 这样的集合,不知道如何实现。
PS :我现在可以使用有限的表集进行查询,例如使用 3-4 个类型参数进行查询,因此可以添加具有固定数量的类型参数的重载,如果有就更好了是 n 个类型参数的一些解决方案。
你或许可以这样写
(T1 r1, T2 r2, T3 r3) Query<T1, T2, T3>(QueryModel q1,QueryModel q2,QueryModel q3 )
这将不允许任意数量的查询,但无论如何您都不能拥有可变数量的泛型参数,所以我看不出有什么方法可以在保留泛型类型的同时做到这一点。
从 C# 7.0 开始,我相信您可以使用元组,例如
List<(T1, T2, T3)> Get<T1,T2,T3>(string query) where T1 : BaseClass, new() where T2 : BaseClass, new() where T3 : BaseClass, new()
{
var result = new List<(T1, T2, T3)>
{
( new T1(), new T2(), new T3()),
( new T1(), new T2(), new T3())
};
return result;
}
我有如下所示的通用查询方法
List<T> Query<T>(QueryModel query) where T : BaseClass
{
// get data and Deserialize by T
}
// where T is Table DTO, to Deserialize response by T
现在想实现多查询并行执行
为此,我需要在响应和输入中使用多个类型参数,并希望实现这样的目标:
List<T1, T2, T3> Query<T1, T2, T3>(List<QueryModel> queries)
where T1: BaseClass,
where T2: BaseClass,
where T3: BaseClass
{
// for each query in queries
// get data for each query and
// deserialize each by T1/T2/T3 accordingly
// return all responses in single generic collection
}
在上面的示例中,可以有 3 个查询,每个查询都可以通过相应地提供的类型化参数进行反序列化。
但我相信我们不能有超过一个类型的参数与像 List 这样的集合,不知道如何实现。
PS :我现在可以使用有限的表集进行查询,例如使用 3-4 个类型参数进行查询,因此可以添加具有固定数量的类型参数的重载,如果有就更好了是 n 个类型参数的一些解决方案。
你或许可以这样写
(T1 r1, T2 r2, T3 r3) Query<T1, T2, T3>(QueryModel q1,QueryModel q2,QueryModel q3 )
这将不允许任意数量的查询,但无论如何您都不能拥有可变数量的泛型参数,所以我看不出有什么方法可以在保留泛型类型的同时做到这一点。
从 C# 7.0 开始,我相信您可以使用元组,例如
List<(T1, T2, T3)> Get<T1,T2,T3>(string query) where T1 : BaseClass, new() where T2 : BaseClass, new() where T3 : BaseClass, new()
{
var result = new List<(T1, T2, T3)>
{
( new T1(), new T2(), new T3()),
( new T1(), new T2(), new T3())
};
return result;
}