[工具类]DataTable与泛型集合List互转

写在前面

工作中经常遇到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
时间: 2024-09-21 15:28:01

[工具类]DataTable与泛型集合List互转的相关文章

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

原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟的部分之一. 我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下: 集合接口 属于JDK还是Guava 对应的Guava工具类 Collection JDK Collections2:不要和jav

Java基础-18总结Map,HashMap,HashMap与Hashtable区别,Collections工具类

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:Map(掌握) (1)将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.  (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯一,值可以重复.夫妻对

Arrays工具类

package cn.com; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; //Arrays类是一个工具类,主要包含用来操作数组(比如排序和搜索)的各种方法. //Arrays类的方法均为静态的 //Collections也是一个工具类,主要操作集合 //此例测试了三个方法Arrays.asList()和Collections.ma

[工具类]泛型集合转换为DataTable

写在前面 在实际项目中,用到了将集合转换为DataTable,就试着封装了一个方法,记录一下. 代码 using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Wolfy.List2DataTable { class

DataTable填充实体类返回泛型集合

     昨天找坤哥看到我的一段代码,如下:           稍微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程,坤哥看了之后问我,如果实体有500多个属性,难道也要这样一条一条的写吗?如果返回多个实体时怎么办?这时,我才意识到自己的代码时非常有问题的,原来设计的是每个方法最多返回一个实体,但是当遇到查询到多条记录的时候,就又冒着破坏三层结构的事返回Datatable去了,真的是很有问题啊.      怎么改,我脑海中一下子就浮现了

Java集合框架:Collections工具类

java.util.Collections工具类提供很多有用的方法,使得程序猿操作集合类的时候更加的方便容易,这些方法都是静态的.整个Collections工具类源码差不多有4000行,我们针对一些典型的方法进行阐述. 1. 调用一个空List,Set,Map public static final List EMPTY_LIST = new EmptyList<>(); public static final Map EMPTY_MAP = new EmptyMap<>(); p

关于DataTable与IList和List泛型集合的相互转换在网上总结

我在做amchart的还有微软相关的chart控件时发现绑定使用Datatabale不能绑定 但是支持DataSet 和泛型集合:于是谢谢网上好友的帮助:自己做了下总结 自己弄了一些集合转化的文章: 对于技术方面的理论我不需多言: 主要是是通过映射命名空间:使用Linq的相关查询:和Type类获取列名:使用泛型转化为实体类后放到集合: 代码如下: 1 publicstaticclass ConvertTolistInfo 2 { 3 ///<summary> 4 /// DataTable 转

Commons-Collections 集合工具类的使用

  package com.bjsxt.others.commons; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.PredicateUtils; import org.apache.commons.collections4.functors.EqualPredi

Java工作利器之常用工具类(四)——Json工具类,使用正则支持xml与json互转

看到这个题目是不是大部分人都不屑一顾,的确基本上每个java程序猿都写过json工具类,也有很多人都使用json-lib.jar封装过类似的功能,但是我这里使用了正则来支持xml与json的互转,减少了jar包的引入.基本上满足了需求.当然如果你需要更强大的功能,还是最好使用json-lib来实现. 主要看一下工具类中的转换json和转换成xml的方法吧. 1. xml转json 具体就不多说了,我是采用的笨方法,多次使用正则进行替换的.比较好的一点儿是支持xml元素属性.如果xml节点有属性会