gpt4 book ai didi

c# - 仅因泛型约束不同的方法重载

转载 作者:IT王子 更新时间:2023-10-29 04:39:25 25 4
gpt4 key购买 nike

我遇到了一些问题,我根本找不到好的解决方法。

我想要这 3 个重载:

public IList<T> GetList<T>(string query) where T: string
public IList<T> GetList<T>(string query) where T: SomeClass
public IList<T> GetList<T>(string query) where T: struct

显然第一个约束甚至不能单独编译,所以这是我的第一个问题。 (我意识到我可以将它设为 IList,但我希望这三个语法相同)

无论如何,所有这一切的原因是,这些方法是围绕对数据库执行 SQL 查询的包装器的一部分 - 我希望能够将结果作为字符串列表返回(以防有人选择 varchar 列),值类型列表(int、float 等)或类列表(这些类表示表,因此包含多列)

我希望这部分是可以理解的:-)

无论如何,我的大问题显然是我无法进行这些重载,因为它们使用相同的名称和参数列表。

我也不能将它们合并到同一个方法中,因为我需要在该实现中调用 SomeClass 上的一个方法,所以除非我想做一些繁重的类型转换,或者更糟的是反射——我需要那个约束。

我意识到我正在尝试做的事情是不可能的,所以我正在寻找一种好的方法,它会模仿我的意图。

如果其中有些不清楚,请随时提问 :-)

编辑:

这是“where T: SomeClass”版本的当前代码。我正在尝试为当前代码添加对字符串/值类型的支持,所以也许我最初的方法完全错误 - 基本上欢迎任何想法 :-)

public IList<TValue> GetList<TValue>(string query) where TValue : DbTable, new()
{
DataSet dataSet = GetDataSet(query);
IList<TValue> result = new List<TValue>();

if (dataSet.Tables.Count > 0)
{
foreach (DataRow row in dataSet.Tables[0].Rows)
{
TValue col = new TValue();
col.Fill(row);
result.Add(col);
}
}

return result;
}

如您所见,我需要确切类型的 DbTable 才能新建正确的构造函数。Fill是DbTable(是一个抽象类)的一个抽象方法。

最佳答案

如您所见;对此没有任何好的选择。您可能会考虑不同的名称(而不是重载)- GetStringList 等。

但是,我想知道取消约束是否会更简单。使用“as”的单一类型检查并不完全是“繁重”的类型转换,它可能会减少很多痛苦。

关于c# - 仅因泛型约束不同的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1097529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com