- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我遇到了一些问题,我根本找不到好的解决方法。
我想要这 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/
我是一名优秀的程序员,十分优秀!