Csharp/C#教程:方法重载只有通用约束才有区别分享


方法重载只有通用约束才有区别

我遇到了一个问题,我根本无法找到一个好的解决办法。

我想要这3个重载:

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

显然第一个约束甚至不会单独编译,所以这是我的第一个问题。 (我意识到我可以让它成为IList但我想要三个相同的语法)

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

我希望这部分有点可以理解:-)

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

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

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

如果其中一些有点不清楚,请随意问:-)

编辑:

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

 public IList GetList(string query) where TValue : DbTable, new() { DataSet dataSet = GetDataSet(query); IList result = new List(); 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#学习教程:方法重载只有通用约束才有区别分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public IList GetList(string query) where T : new() { // whatever you need to distinguish, this is a guess: if (typeof(T).IsPrimitiveValue) { GetPrimitiveList(query); } else if (typeof(T) == typeof(string)) { GetStringList(query); } else { GetEntityList(query); } } private IList GetStringList(string query) private IList GetPrimitiveList(string query) private IList GetEntityList(string query) 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/984979.html

(0)
上一篇 2021年12月20日
下一篇 2021年12月20日

精彩推荐