C#实现DataTable映射成Model的方法(附源码)

 更新时间:2015年11月27日 11:17:29   作者:Jimmy.Yang  
这篇文章主要介绍了C#实现DataTable映射成Model的方法,以实例形式较为详细的分析了DataTable映射成Model的具体步骤与相关技巧,并附带了完整实例源码供读者下载,需要的朋友可以参考下

本文实例讲述了C#实现DataTable映射成Model的方法。分享给大家供大家参考,具体如下:

这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。

反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。

步骤1:先创建一个DataFieldAttribute类

using System;
namespace Jimmy.ORM
{
 [AttributeUsage(AttributeTargets.Property)]
 public sealed class DataFieldAttribute:Attribute
 {
 /// <summary>
 /// 表对应的字段名
 /// </summary>
 public string ColumnName { set; get; }
 public DataFieldAttribute(string columnName)
 {
  ColumnName = columnName;
 }
 }
}

步骤2:在Model/Entity的Class成员上,应用DataField特性,参见下面的代码:

using System;
namespace Jimmy.ORM.Entity
{
 [Serializable]
 public class ProductEntity : DataEntityBase
 {
 [DataField("PRODUCT_NO")]
 public string ProductNo { set; get; }
 [DataField("PRODUCT_ID")]
 public int ProductId { set; get; }
 [DataField("PRODUCT_NAME")]
 public string ProductName { set; get; }
 public override string ToString()
 {
  return string.Format("ProductNo:{1}{0}ProductId:{2}{0}ProductName:{3}", Environment.NewLine, ProductNo,
     ProductId, ProductName);
 }
 }
}

步骤3:该反射出场了,为了方便起见,封装了一个DataConvert类

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
namespace Jimmy.ORM
{
 /// <summary>
 /// 将DataRow/DataTable转换成Entity/Entity列表
 /// </summary>
 public static class DataConvert<T> where T : DataEntityBase, new()
 {
 /// <summary>
 /// 将DataRow行转换成Entity
 /// </summary>
 /// <param name="dr"></param>
 /// <returns></returns>
 public static T ToEntity(DataRow dr)
 {
  T entity = new T();
  Type info = typeof(T);
  var members = info.GetMembers();
  foreach (var mi in members)
  {
  if (mi.MemberType == MemberTypes.Property)
  {
   //读取属性上的DataField特性
   object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true);
   foreach (var attr in attributes)
   {
   var dataFieldAttr = attr as DataFieldAttribute;
   if (dataFieldAttr != null)
   {
    var propInfo = info.GetProperty(mi.Name);
    if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
    {
    //根据ColumnName,将dr中的相对字段赋值给Entity属性
    propInfo.SetValue(entity,
     Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
     null);
    }
   }
   }
  }
  }
  return entity;
 }
 /// <summary>
 /// 将DataTable转换成Entity列表
 /// </summary>
 /// <param name="dt"></param>
 /// <returns></returns>
 public static List<T> ToList(DataTable dt)
 {
  List<T> list = new List<T>(dt.Rows.Count);
  foreach (DataRow dr in dt.Rows)
  {
  list.Add(ToEntity(dr));
  }
  return list;
 }
 }
}

步骤4:测试

using System;
using System.Data;
using Jimmy.ORM.Entity;
namespace Jimmy.ORM.Test
{
 class Program
 {
 static void Main()
 {
  DataTable dt = new DataTable();
  dt.Columns.Add("PRODUCT_NO");
  dt.Columns.Add("PRODUCT_ID");
  dt.Columns.Add("PRODUCT_NAME");
  dt.Rows.Add("00001", 1, "手机");
  dt.Rows.Add("00002", 2, "服装");
  var products = DataConvert<ProductEntity>.ToList(dt);
  foreach (var entity in products)
  {
  Console.WriteLine(entity);
  }
  Console.Read();
 }
 }
}

完整实例代码代码点击此处本站下载

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • C#中常量和只读变量的区别小结

    C#中常量和只读变量的区别小结

    本篇文章主要是对C#中常量和只读变量的区别进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码...
    2007-04-04
  • C#根据IP地址查询所属地区实例详解

    C#根据IP地址查询所属地区实例详解

    这篇文章主要介绍了C#根据IP地址查询所属地区实例详解,调用的接口是免费的接口,有需要的同学可以研究下
    2021-03-03
  • C#中的char与string详解

    C#中的char与string详解

    本文详细讲解了C#中的char与string,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • C#实现简单的点餐系统

    C#实现简单的点餐系统

    这篇文章主要为大家详细介绍了C#实现简单的点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#中的lock()如何使用

    C#中的lock()如何使用

    在C#中,lock 关键字用于确保某个代码块在任何时刻只被一个线程访问,本文主要介绍了C#中的lock()如何使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • c++ STL之list对结构体的增加,删除,排序等操作详解

    c++ STL之list对结构体的增加,删除,排序等操作详解

    这篇文章主要介绍了c++ STL之list对结构体的增加,删除,排序等操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C#使用RSA加密解密文件

    C#使用RSA加密解密文件

    这篇文章主要为大家详细介绍了C#使用RSA加密解密文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • c# 实现KMP算法的示例代码

    c# 实现KMP算法的示例代码

    这篇文章主要介绍了c# 实现KMP算法的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • C#之IP地址和整数互转的小例子

    C#之IP地址和整数互转的小例子

    C#之IP地址和整数互转的小例子,需要的朋友可以参考一下
    2013-03-03

最新评论