zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    ObjectiveC语法快速参考
    IIS网站全部显示无权访问需要登录
    如何让自己的网站尽快收录绍兴114导航
    asp.net的运行原理
    WPF学习视频资料
    Asp.net MVC3 自定义HtmlHelper控件
    Unity3D中C#和JS的方法互相調用
    对于冒泡算法的思考,大牛可一笑而过~~
    2013年年前瞻望与计划
    使用vs2010编辑Unity脚本,配置方法
  • 原文地址:https://www.cnblogs.com/neverstop/p/4095526.html
Copyright © 2011-2022 走看看