欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 13:57:48
本文实例讲述了c#实现datatable映射成model的方法。分享给大家供大家参考,具体如下: 这是数据库开发中经常遇到的问题,当然,这可以用现成的orm框架来解决,但...

本文实例讲述了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#程序设计有所帮助。