DataTable与DTO对象的简易转换类

  在web开发过程中,有时候为了数据传输的方便,比如:后台需要更新前端的ViewModel,此时我们定义一个与前端ViewModel结构一样的DTO对象,从数据层获取数据后,将数据封装成DTO然后序列化为json传回前端,由于我正在开发的项目中的Model是用DataSet来实现的,不是纯粹的面向对象(如果Model是对象的话可以用AutoMapper来实现转换),所以从数据层获取的都是DataSet或DataTable,这时需要将DataTable转换为DTO对象,DTO对象的属性与DataTable的列之间并不是一一对应的关系,为了转换方便,实现了一个简易的转换类,代码如下:

  1 public class DtObjConverter
  2     {
  3
  4         /// <summary>
  5         /// 将DataTable转换成对象,对象的属性与列同名
  6         /// </summary>
  7         /// <typeparam name="T"></typeparam>
  8         /// <param name="datatable"></param>
  9         /// <returns></returns>
 10         public List<T> ConvertTo<T>(DataTable datatable) where T : new()
 11         {
 12             List<T> Temp = new List<T>();
 13             try
 14             {
 15                 List<string> columnsNames = new List<string>();
 16                 foreach (DataColumn DataColumn in datatable.Columns)
 17                     columnsNames.Add(DataColumn.ColumnName);
 18                 Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
 19                 return Temp;
 20             }
 21             catch
 22             {
 23                 return Temp;
 24             }
 25
 26         }
 27
 28         /// <summary>
 29         /// 将DataTable转换成对象,对象的属性会根据map参数进行转换
 30         /// </summary>
 31         /// <typeparam name="T"></typeparam>
 32         /// <param name="datatable"></param>
 33         /// <param name="map"></param>
 34         /// <returns></returns>
 35         public List<T> ConvertTo<T>(DataTable datatable, Hashtable map) where T : new()
 36         {
 37             List<T> Temp = new List<T>();
 38             try
 39             {
 40                 List<string> columnsNames = new List<string>();
 41                 foreach (DataColumn DataColumn in datatable.Columns)
 42                     columnsNames.Add(DataColumn.ColumnName);
 43                 Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getMapObject<T>(row, columnsNames, map));
 44                 return Temp;
 45             }
 46             catch
 47             {
 48                 return Temp;
 49             }
 50
 51         }
 52
 53         /// <summary>
 54         /// 根据DataTable生成对象,对象的属性与列同名
 55         /// </summary>
 56         /// <typeparam name="T"></typeparam>
 57         /// <param name="row"></param>
 58         /// <param name="columnsName"></param>
 59         /// <returns></returns>
 60         public T getObject<T>(DataRow row, List<string> columnsName) where T : new()
 61         {
 62             T obj = new T();
 63             try
 64             {
 65                 string columnname = "";
 66                 string value = "";
 67                 PropertyInfo[] Properties;
 68                 Properties = typeof(T).GetProperties();
 69                 foreach (PropertyInfo objProperty in Properties)
 70                 {
 71                     columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
 72                     if (!string.IsNullOrEmpty(columnname))
 73                     {
 74                         value = row[columnname].ToString();
 75                         if (!string.IsNullOrEmpty(value))
 76                         {
 77                             if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
 78                             {
 79                                 value = row[columnname].ToString().Replace("$", "").Replace(",", "");
 80                                 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
 81                             }
 82                             else
 83                             {
 84                                 value = row[columnname].ToString().Replace("%", "");
 85                                 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
 86                             }
 87                         }
 88                     }
 89                 }
 90                 return obj;
 91             }
 92             catch
 93             {
 94                 return obj;
 95             }
 96         }
 97
 98         /// <summary>
 99         /// 根据DataTable生成对象,对象的属性会根据map参数进行转换
100         /// </summary>
101         /// <typeparam name="T"></typeparam>
102         /// <param name="row"></param>
103         /// <param name="columnsName"></param>
104         /// <returns></returns>
105         public T getMapObject<T>(DataRow row, List<string> columnsName, Hashtable map) where T : new()
106         {
107             T obj = new T();
108             try
109             {
110                 string columnname = "";
111                 string value = "";
112                 PropertyInfo[] Properties;
113                 Properties = typeof(T).GetProperties();
114                 foreach (PropertyInfo objProperty in Properties)
115                 {
116                     string prpertyName = objProperty.Name;
117                     columnname = columnsName.Find(name => name.ToLower() == map[prpertyName].ToString().ToLower());
118                     if (!string.IsNullOrEmpty(columnname))
119                     {
120                         value = row[columnname].ToString();
121                         if (!string.IsNullOrEmpty(value))
122                         {
123                             if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
124                             {
125                                 value = row[columnname].ToString().Replace("$", "").Replace(",", "");
126                                 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
127                             }
128                             else
129                             {
130                                 value = row[columnname].ToString().Replace("%", "");
131                                 objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
132                             }
133                         }
134                     }
135                 }
136                 return obj;
137             }
138             catch (Exception e)
139             {
140                 string error = e.Message;
141                 return obj;
142             }
143         }
144
145         public DataTable ToDataTable<T>(IEnumerable<T> collection)
146         {
147             DataTable newDataTable = new DataTable();
148             Type impliedType = typeof(T);
149             PropertyInfo[] _propInfo = impliedType.GetProperties();
150             foreach (PropertyInfo pi in _propInfo)
151                 newDataTable.Columns.Add(pi.Name, pi.PropertyType);
152
153             foreach (T item in collection)
154             {
155                 DataRow newDataRow = newDataTable.NewRow();
156                 newDataRow.BeginEdit();
157                 foreach (PropertyInfo pi in _propInfo)
158                     newDataRow[pi.Name] = pi.GetValue(item, null);
159                 newDataRow.EndEdit();
160                 newDataTable.Rows.Add(newDataRow);
161             }
162             return newDataTable;
163         }
164
165     }

用法:

DtObjConverterConvert convert = new DtObjConverterConvert ();

//配置映射
Hashtable map = new Hashtable();
map.Add("Title", "name");  //key为对象属性名,value为表列名
/*----- 此处省略其他字段的添加 -----*/
List<YourDTOModel> dtoModelList = convert.ConvertTo<YourDTOModel>(dt, map);
时间: 2024-08-15 08:34:39

DataTable与DTO对象的简易转换类的相关文章

对象属性拷贝工具类的性能比较

一.对象属性拷贝工具类 ”天下武功,唯快不破“.在互联网行业中体现的更加淋淋尽致.我们在业务系统会经常遇到业务对象间属性的拷贝,对如外接口一般都使用特定的DTO对象,而不会使用领域模型,以避免两者的变动互相影响.我们不仅要关注“快”,还要注重CPU的稳定即避免CPU使用的大起大落现象.如何高效完成属性的拷贝并降低对CPU的使用率或避免CPU的抖动. 相关博文已经有很多,为什么还要自己在一篇类似的哪?原因有二:一是加深理解二是比较各自优劣.目前对象间属性的拷贝常用的方法大致如下: 手动拷贝(set

JavaScript中对象类型的转换小结

对象到字符串和对象到数字类型的转换涉及到两个重要的方法,最终的转换结果会受到这两个方法返回结果的影响,这两个方法就是toString和valueOf.所有的对象都会从Object对象中继承到这两个方法.toString方法 用于返回对象的字符串表示(但是其实也可以不返回字符串).对于默认从Object继承而来的toString方法并不会返回太多有意义的内容.而valueOf方法目的是返回一个可以表示对象的原始类型值,但是由于对象的复杂性,大多数情况下根本不可能用一个原始类型值来表示,所以默认的v

第七章 课堂例子 怎样判断对象是否可以转换?

怎样判断对象是否可以转换? 可以使用instanceof运算符判断一个对象是否可以转换为指定的类型: Object obj="Hello"; if(obj instanceof String) System.out.println("obj对象可以被转换为字符串"); public class ka { public static void main(String[] args) { //声明hello时使用Object类,则hello的编译类型是Object,Ob

日期转换类

1:   2: // 创建日期: 2008-04-23 3: // 说 明: 日期,时间处理相关的类,大多转换为字符串. 4: using System; 5: using System.Collections.Generic; 6: using System.Text; 7:   8: namespace AnkeEdu.Tools 9: { 10: /// <summary> 11: /// 日期,时间处理 12: /// </summary> 13: public stati

DTO对象

在EF中,EF生成的对象都是代理对象,这些对象看上去是实体类对象,但是其实都是EF封装好的代理类对象.所以调用EF查询得到的代理类对象有继承于实体对象,所以可以用实体类对象来接收返回的代理类对象.EF实体对象包括了外键属性,所以在对EF查询到的对象进行序列化时,因为存在循环引用,会导致序列化出错(JavascriptSerializer无法识别被序列化的对象里的各种属性循环依赖).所有不能直接用JavascriptSerializer直接去序列化EF实体对象.因此需要讲定义DTO对象来接收该对象

c++,派生类对象可以对基类赋值,基类对派生类不可以赋值

#include <iostream> using namespace std; class DemoA { public: int m_a; void show(); DemoA(int val); }; DemoA::DemoA(int val) { m_a = val ; } void DemoA::show() { cout<<"ashow: DemoA.m_a="<<this->m_a<<endl; } //-------

几何对象的结构和类

为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类.这些结构和类分别定义在头文件windef.h和afxwin.h中. 1.点 1)点结构POINT 点数据结构POINT用来表示一点的x.y坐标: typedef struct tagPOINT { LONG x; LONG y; } POINT; 2)点类CPoint 点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种: CPoint( ); CPoint( int initX, i

Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布

摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法. 主要特点:          1.设计精巧,使用简单          2.接口丰富,扩展简单          3.默认值多,write less do more          4.AbstractView 支持,web导出可以简单明了 一

PHP面向对象简易验证码类

PHP简易验证码类 1 <?php 2 3 class authCode 4 { 5 private static $instance = null; #实例对象 6 private $width = 120; #图片宽度 7 private $height = 40; #图片高度 8 private $font = 'font/elephant.ttf'; #字体文件路径 9 private $fontSize = 14; #字体大小 10 private $strLen = 6; #字符个数