码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈 System.Data.DataRowCollection 类

时间:2015-07-31 07:54:09      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

我们来看看以下程序吧:

01:  using System;
02:  using System.Data;
03:  using System.Linq;
04:  
05:  namespace Skyiv.Ben
06:  {
07:    class Program
08:    {
09:      static void Main()
10:      {
11:        var dt = new DataTable();
12:        dt.Rows.Add();
13:        foreach (var row in dt.Select())
14:        {
15:          Console.WriteLine(row.GetType());
16:          Console.WriteLine(row.RowState);
17:        }
18:      }
19:    }
20:  }

上述程序中第 12 行中的 DataTable 类的 Rows 属性的类型为 DataRowCollection 类。第 13 行中的 DataTable 类的 Select 方法返回 DataRow[] 数组。我们知道,foreach 语句对实现System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口的数组或对象集合中的每个元素重复一组嵌入式语句。所以该 foreach 语句中的 row 变量的类型被推断为 DataRow 类。这个程序的运行结果如下所示:

System.Data.DataRow
Added

如果把上述程序中的第 13 行改为:

13:        foreach (var row in dt.Rows)

这时,会出错以下编译错误:

Program.cs(16,31): error CS1061:
        “object”不包含“RowState”的定义,并且找不到可接受类型为“object”的第
        一个参数的扩展方法“RowState”(是否缺少 using 指令或程序集引用?)

这是因为 DataRowCollection 类只实现了 System.Collections.IEnumerable 接口,而没有实现 System.Collections.Generic.IEnumerable<DataRow> 接口,所以该 foreach 语句中的 row 变量的类型被推断为System.Object 类。

仅实现 IEmnumerable 接口而没有实现 IEnumerable<T> 接口的集合类还有非常多,例如:

因为泛型是在 .NET 2.0 中才引入的,上述类中的大部分都是在 .NET 1.0 中已经就有了。但是 Microsoft 应该在 .NET 2.0 以后为上述类实现 IEnumerable<T> 接口才对。这不能不说是 .NET Framework Base Class Library 的一个遗憾。请参阅 MSDN 论坛上的一个相关的帖子:Missing linq extension method 。

幸运的是,在 .NET Framework 3.5 及其以后的版本中, 在 System.Linq 命名空间中增加了 IEnumerable.Cast<TResult> 扩展方法,可以将 IEnumerable 的元素转换为指定的 TResult 类型。这样,上述程序第 13 行改为:

13:        foreach (var row in dt.Rows.Cast<DataRow>())

就可以正常工作了。当然,在这个场合还有更好的解决方案,就是将第 13 行改为:

13:        foreach (DataRow row in dt.Rows)

就可以了。

也有好消息,就是 System.Collections.ObjectModel 命名空间中的 Collection<T> 类实现了 IEnumerable<T> 接口,而 Collection<T> 类有很多派生类。例如 System.Net 命名空间中的 IPEndPointCollection 类就是从 Collection<IPEndPoint> 类继承,因此也就实现了 IEnumerable<IPEndPoint> 接口。

版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。

浅谈 System.Data.DataRowCollection 类

标签:

原文地址:http://blog.csdn.net/u013141940/article/details/47163935

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!