我正在尝试将遗留的 C# .NET 1.1 应用程序带入现代时代。我们使用 DataTables 来收集可能是业务对象的内容。
鉴于大多数代码都认为它正在与 DataRow 的接口通信,那么什么样的泛型集合才能实现最不痛苦的转换?
如果我正确地阅读了您的问题,那么您正在询问哪个容器将只存储您的业务对象列表,然后允许您仅枚举集合,或通过索引进行选择。
好吧,我会考虑查看 List<>
您的方法将接受 IList<> (访问索引)或 IEnumerable<> (在集合上使用 foreach 循环)
例如
private void PrintAll<T>(IEnumerable<T> items)
{
foreach(T item in items)
Console.WriteLine(item.ToString());
}
现在我可以传入任何使用 IEnumerable<> 接口的容器,包括 List<> 和普通数组
例子
List<Person> people = new List<Person>();
//add some people to the list
PrintAll<Person>(people);
高温高压
骨头
与其放弃 DataSet/DataTable API,为什么不将 DataTable 和 DataRow 子类化为适合您的业务逻辑的类型呢?
对子类 DataRow 和 DataTable 对象的支持非常出色。您将在新代码中获得所需的强类型,以及旧代码的向后兼容性。此外,您可以在需要/想要的任何地方注入业务逻辑。
如果你习惯了DataTable
,想必你习惯了适配器(etc)带来的变化跟踪和持久性支持。在这种情况下,您是否考虑过 LINQ-to-SQL 和/或实体框架?它们都支持丰富的变更跟踪和自动持久性,同时提供各种其他 DAL 用例,例如可组合查询和所有其他 LINQ 优点。
绝对值得调查。
请注意,更改为类型化的 POCO 实体(即不是DataRow
其子类)仍然是一个很大的偏差,因此它不会是一个简单的更改。如果您没有时间进行重大更改,那么坚持下去DataTable
(也许是打字)将是务实的。
这将为您提供EntitySet<T>
,IQueryable<T>
等,或者您可以只使用List<T>
,Collection<T>
等来临时使用。
将您的“应用程序带入现代时代”的最简单方法是将代码从 Visual Studio 2003 升级到 2005 或 2008。如果您希望向您的类添加行为(“可能是业务对象”)事实上,DataSet、DataTable 和 DataRow 是作为部分类实现的。
上面提到的解决方案会为您失去很多东西,包括更改跟踪,除非那是您正在寻找的东西——在很大程度上偏离。LINQ to SQL、实体框架等都提供了更改跟踪,但在连接到数据库的工作单元机制内,而不是像 DataRow 那样将工作单元跟踪直接放在您的对象上。
希望你不是简单地改变以将你的“应用程序带入现代时代”,并且你有一些你试图为你放弃的功能和你付出的努力而获得的好处?
顺便说一句,这一切都假设您使用的是类型化数据集……在我看来,对于大多数用途来说,非类型化数据集对象有点傻。