利用扩展方法将DataTable转换为特定类型的对象数组

在ADO.NET中,从数据库中获得的数据可以保存在DataTable中,当然这个DataTable可以是强类型的。但是很多时候,我们都是用弱类型的DataTable, 那么有没有一个简单的方法可以把一个DataTable转换为一个特定类型的对象数组?
其实在LINQ To SQL中,用了一些attribute来辅助.net将一个数据库中的table转换为一个Object,这些attribute位于System.Data.Linq.Mapping namespace下,主要是TableAttribute和ColumnAttribute。

假设数据库中有一个user的table,那么我们可以定义一个User的class:

  1.     public class User
  2.     {
  3.         private int id;
  4.         private string name;

  5.         [Column(Name="id")]
  6.         public int ID
  7.         {
  8.             get
  9.             {
  10.                 return this.id;
  11.             }
  12.             set
  13.             {
  14.                 this.id = value;
  15.             }
  16.         }
  17.         [Column(Name = "name")]
  18.         public string Name
  19.         {
  20.             get
  21.             {
  22.                 return this.name;
  23.             }
  24.             set
  25.             {
  26.                 this.name = value;
  27.             }
  28.         }
  29.     }
我们用 Column Attribute来标识User的属性在user Table中对应的列名。然后,我们可以为DataTable提供一个扩展方法来将DataTable转换为一个数组:
  1. public static T[] ToObject<T>(this DataTable dataTable)
  2.     where T:new()
  3. {           
  4.     List<T> list=new List<T>();
  5.     foreach(DataRow row in dataTable.Rows)
  6.     {
  7.         T t = new T();
  8.         Type type = t.GetType();
  9.         PropertyInfo[] propertyInfos =type.GetProperties();
  10.         if (propertyInfos != null && propertyInfos.Length > 0)
  11.         {
  12.             foreach (PropertyInfo info in propertyInfos)
  13.             {
  14.                 object[] columns =info.GetCustomAttributes(typeof(ColumnAttribute),true);
  15.                 if (columns != null && columns.Length == 1)
  16.                 {
  17.                     ColumnAttribute ca = columns[0] as ColumnAttribute;
  18.                     string name = ca.Name;
  19.                     if (name == null || name.Length == 0)
  20.                     {
  21.                         name = info.Name;
  22.                     }
  23.                     object propertyValue = row[name];
  24.                     if (propertyValue == DBNull.Value)
  25.                     {
  26.                         propertyValue = null;
  27.                     }
  28.                     info.SetValue(t, propertyValue, null);
  29.                 }
  30.             }
  31.         }
  32.         list.Add(t);
  33.     }
  34.     return list.ToArray();;
  35. }
最后,提供一下如何使用该方法来从数据库中获取user列表(使用MySQL数据库);

  1. using (MySqlConnection connection = new MySqlConnection(this.connectionString))
  2. {
  3.     connection.Open();
  4.     MySqlDataAdapter dataAdapter = new MySqlDataAdapter("select * from user", connection);     
  5.     DataTable dt = new DataTable();
  6.     dataAdapter.Fill(dt);
  7.    User[] users=dt.ToObject<User>();
  8.    //Now we get the user list...
  9. }
当然,DataTable的扩展方法还远没有完善,应该还需要考虑类型转换之类的问题。更进一步的改进可能是利用工具来自动生成User class,这样就能省下一定的工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值