当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现DataTable映射成Model的方法(附源码)

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网