写在前面

工作中经常遇到datatable与list,对于datatable而言操作起来不太方便。所以有的时候还是非常希望通过泛型集合来进行操作的。所以这里就封装了一个扩展类。也方便使用。

方法中主要使用了反射的方式动态的为属性赋值以及取值。

   public static class Extension{/// <summary>/// 将datatable转换为泛型集合/// </summary>/// <typeparam name="TEntity"></typeparam>/// <param name="inputDataTable"></param>/// <returns></returns>public static List<TEntity> ToList<TEntity>(this DataTable inputDataTable) where TEntity : class,new(){if (inputDataTable == null){throw new ArgumentNullException("input datatable is null");}Type type = typeof(TEntity);PropertyInfo[] propertyInfos = type.GetProperties();List<TEntity> lstEntitys = new List<TEntity>();foreach (DataRow row in inputDataTable.Rows){object obj = Activator.CreateInstance(type);foreach (PropertyInfo pro in propertyInfos){foreach (DataColumn col in inputDataTable.Columns){//如果直接查询的数据库,数据库是不区别大小写的,所以转换为小写忽略大小写的问题if (col.ColumnName.ToLower().Equals(pro.Name.ToLower())){//属性是否是可写的,如果是只读的属性跳过。if (pro.CanWrite){//判断类型,基本类型,如果是其他的类属性if (pro.PropertyType == typeof(System.Int32)){pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()]));}else if (pro.PropertyType == typeof(System.String)){pro.SetValue(obj, row[pro.Name.ToLower()].ToString());}else if (pro.PropertyType == typeof(System.Boolean)){pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()]));}else if (pro.PropertyType == typeof(System.DateTime)){pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()]));}else if (pro.PropertyType == typeof(System.Int64)){pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()]));}else{pro.SetValue(obj, row[pro.Name.ToLower()]);}}}}}TEntity tEntity = obj as TEntity;lstEntitys.Add(tEntity);}return lstEntitys;}/// <summary>/// 将list转换为datatable/// </summary>/// <typeparam name="TEntity"></typeparam>/// <param name="inputList"></param>/// <returns></returns>public static DataTable ToDataTable<TEntity>(this List<TEntity> inputList) where TEntity : class,new(){if (inputList == null){throw new ArgumentNullException("inputList");}DataTable dt = null;Type type = typeof(TEntity);if (inputList.Count == 0){dt = new DataTable(type.Name);return dt;}else{dt=new DataTable();}PropertyInfo[] propertyInfos = type.GetProperties();foreach (var item in propertyInfos){dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType = item.PropertyType });}foreach (var item in inputList){DataRow row = dt.NewRow();foreach (var pro in propertyInfos){row[pro.Name] = pro.GetValue(item);}dt.Rows.Add(row);}return dt;}

总结

有些时候能偷懒就偷懒了,把常用的工具类自己封装下,下次使用的时候拿来用就可以了。

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/5018901.html

[工具类]DataTable与泛型集合List互转相关推荐

  1. 【机房收费个人版】DataTable 与泛型集合的较量

    将近三周的时间,我学到了很多知识,让我受益匪浅!也通过这三周的积累和整理,现在是时候写博客分享我的所知所得了..下面主要写DataTable.泛型集合以及它们之间的比较.. DataTable     ...

  2. sqlite工具类 java_Java之泛型、集合工具类

    集合工具类 在我们讲完常用的基本集合后,我们就要介绍下位于java.util包下的collections类,注意:我们之前的collection是集合的接口,而collections是一个类.coll ...

  3. Java工具类、异常和集合(温习知识点)

    今日内容 * 工具类* API* Object类* String类* StringBuffer类* StringBuilder类* Math类* Array类* System类* 包装类* BigIn ...

  4. java list排序工具类_java 之 Collections集合工具类排序

    数组有工具类Arrays,集合也有一个工具类Collections. sort方法: sort(List list):根据其元素natural ordering对制定的列表进行排序 sort(List ...

  5. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet

    一.集合的特点 二.继承结构图 三.List集合 1.特点     2.ArrayList类     3.LinkedList类     4.两者的对比     5.集合的遍历 四.Set集合 1.特 ...

  6. Java学习day18-集合框架2(泛型,工具类,TreeMap)

    集合框架2 今日目标 一.泛型 1.泛型类 2.泛型接口 3.泛型方法 4.泛型通配符 二.集合工具类 三.TreeMap和TreeSet 作业: 今日目标 泛型 集合工具类 自带排序集合 一.泛型 ...

  7. java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...

    一.前言 基于granite源码包org.granite.util.CollectionUtil集合工具类,分别获取集合反射类型java.lang.reflect.Type.实例化newCollect ...

  8. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  9. 【集合工具类:Collections】

    集合工具类:Collections (1) 是针对集合进行操作的工具类 (2) 面试题:Collection 和 Collections 的区别 A:Collection 是单列集合的顶层接口,有两个 ...

最新文章

  1. 机器学习最常用的优化算法 — 梯度下降法
  2. mysql之基础操作grant、show、repair、log_error等
  3. java 短路判断_随笔 | 奇淫技巧 | Java:记 return 和短路运算符的妙用
  4. JavsScript中比较大小总结---基于sort()方法
  5. 让vs2008支持jQuery的智能提示!
  6. c语言 在执行区域没有空格,C语言上机操作指导之TurboC.doc
  7. java mysql blob 存储图片_Java操作mysql存储图片
  8. C++自学-默认参数的函数
  9. 基于 webdriver 的测试代码日常调试方python 篇
  10. Pomodoro Do - 拖延症患者的福音
  11. PS绘画蒙板使用方法
  12. 集合:List接口:ArrayList,LinkedList Set接口:HashSet
  13. leetcode954.二倍数对数组C++(绝对值排序)
  14. 差分放大电路的基本工作原理是什么//2021-2-18
  15. CSGO手套武器箱直接卖还是开了再卖?
  16. 手把手教你搭建一个直播服务器(Nginx+Rtsp)
  17. 2020李宏毅深度学习hw1
  18. 计算机word怎么选中全文,word选定全文快捷键是什么
  19. 源码解读之Pre-train
  20. 2022-2027年中国集团幼儿园行业市场深度分析及投资战略规划报告

热门文章

  1. 小白设计模式:桥接模式
  2. 贴一个数据结构老师布置的作业(各种排序) c 语言实现
  3. AndroidStudio安卓原生开发_UI控件_SeekBar_ProgressBar_DataPicker---Android原生开发工作笔记99
  4. 持续集成部署Jenkins工作笔记0004---Subversion环境要求
  5. JAVA线程池_并发队列工作笔记0004---Callable原理_多线程执行Callable任务
  6. Netty工作笔记0010---Channel应用案例1
  7. SpringCloud工作笔记071---mysql字符集 utf8 和utf8mb4 的区别_utf8是不能存储emoji表情字符集的
  8. SpringCloud工作笔记039---spring cloud、javaweb中获取request对象的几种方法
  9. viso stido 在图上写字
  10. 在实验室服务器毫无阻拦的安装pip3