IList转DataTable、DataTable转IList

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Linq;
 using System.Reflection;
 using System.Text;

 namespace Framework.Utility
 {
     public static class DataTableHelper
     {
         public static DataTable ConvertTo<T>(IList<T> list)
         {
             DataTable table = CreateTable<T>();
             Type entityType = typeof(T);
             PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
             foreach (T item in list)
             {
                 DataRow row = table.NewRow();
                 foreach (PropertyDescriptor prop in properties)
                     row[prop.Name] = prop.GetValue(item);
                 table.Rows.Add(row);
             }
             return table;
         }

         public static IList<T> ConvertTo<T>(IList<DataRow> rows)
         {
             IList<T> list = null;
             if (rows != null)
             {
                 list = new List<T>();
                 foreach (DataRow row in rows)
                 {
                     T item = CreateItem<T>(row);
                     list.Add(item);
                 }
             }
             return list;
         }

         public static IList<T> ConvertTo<T>(DataTable table)
         {
             try
             {
                 if (table == null)
                     return null;

                 List<DataRow> rows = new List<DataRow>();
                 foreach (DataRow row in table.Rows)
                     rows.Add(row);

                 return ConvertTo<T>(rows);
             }
             catch(Exception ex)
             {
                 string err = ex.ToString();
                 return null;
             }
         }

         public static T CreateItem<T>(DataRow row)
         {
             string columnName;
             T obj = default(T);
             if (row != null)
             {
                 obj = Activator.CreateInstance<T>();
                 foreach (DataColumn column in row.Table.Columns)
                 {
                     columnName = column.ColumnName;
                     //Get property with same columnName
                     PropertyInfo prop = obj.GetType().GetProperty(columnName);
                     if (prop == null) continue;
                     ) continue;
                     try
                     {
                         //Get value for the column
                         object value = (row[columnName].GetType() == typeof(DBNull))
                         ? null : row[columnName];
                         //Set property value
                         if (prop.CanWrite)    //判断其是否可写
                             prop.SetValue(obj, value, null);
                     }
                     catch
                     {
                         throw;

                     }
                 }
             }
             return obj;
         }

         public static DataTable CreateTable<T>()
         {
             Type entityType = typeof(T);
             DataTable table = new DataTable(entityType.Name);
             PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

             foreach (PropertyDescriptor prop in properties)
                 table.Columns.Add(prop.Name, prop.PropertyType);

             return table;
         }
         /// <summary>
         /// datatable 转换成list
         /// 调用方法:List<Entity> list = DataTableHelper.ConvertToEx<Entity>(dt);
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="dt"></param>
         /// <returns></returns>
         public static List<T> ConvertToEx<T>(DataTable dt) where T : new()
         {
             if (dt == null) return null;
             ) return null;

             List<T> list = new List<T>();
             Type type = typeof(T);
             PropertyInfo[] propertyInfos = type.GetProperties();  //获取泛型的属性
             List<DataColumn> listColumns = dt.Columns.Cast<DataColumn>().ToList();  //获取数据集的表头,以便于匹配
             T t;
             foreach (DataRow dr in dt.Rows)
             {
                 t = new T();
                 foreach (PropertyInfo propertyInfo in propertyInfos)
                 {
                     try
                     {
                         DataColumn dColumn = listColumns.Find(name => name.ToString().ToUpper() == propertyInfo.Name.ToUpper());  //查看是否存在对应的列名
                         if (dColumn != null)
                             propertyInfo.SetValue(t, dr[propertyInfo.Name], null);  //赋值
                     }
                     catch (Exception ex)
                     {
                         throw new Exception(ex.Message);
                     }
                 }
                 list.Add(t);
             }
             return list;
         }

     }
 }

【2017001】IList转DataTable、DataTable转IList的更多相关文章

  1. DataTable转换成IList<T>的简单实现

    DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...

  2. C# IList<T>转为DataTable

    public class WebUtil { /// <summary> /// 转换IList<T>为DataTable/// </summary> /// &l ...

  3. C# 中 DataTable转换成IList

    在用C#作开发的时候经常要把DataTable转换成IList:操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便. 注意:实体的 ...

  4. DataTable转换成IList 【转载】

    链接:http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html#2738813 留着学习 using System; using Syst ...

  5. DataTable转换成IList

    //文章出处: http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html DataTable转换成IList 在用C#作开发的时候经常要把 ...

  6. 将SqlDataReader 数据集转化为datatbale ,在将datatable 转化为iList

    public IList GetModelList(string tablename, string where) { IList list = null; DataTable dataTable = ...

  7. [DataTable] datatable根据表中的字段进行排序

    private DataTable SortTable(DataTable dt,string[] pids) { DataTable dt0 = dt.Clone(); //复制原表结构 ;i< ...

  8. MVC中一般为什么用IQueryable而不是用IList?用IQueryable比IList好在哪?

    IList(IList<T>)会立即在内存里创建持久数据,这就没有实现"延期执行(deferred execution)",如果被加载的实体有关联实体(associat ...

  9. 完整DataTable与IList互换(转)

    public class CollectionHelper { private CollectionHelper() { } public static DataTable ConvertTo< ...

随机推荐

  1. 【转】OkHttp使用进阶 译自OkHttp Github官方教程

    作者:GavinCT 出处:http://www.cnblogs.com/ct2011/ 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响 ...

  2. VueJS开发所用到的技术栈

    1. 主要使用vue.js2. 使用vue-cli脚手架搭建项目3. 使用vue-router来做路由,实现单页面跳转4. 使用iView UI作为前端UI框架,Mouse UI作为手机端UI框架5. ...

  3. Web前端面试指导(十一):样式导入有哪些方式?

    样式导入方式 link import 使用方式 link的使用 <link href="index.css" rel="stylesheet"> i ...

  4. Linux下OCI环境配置

    ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORA ...

  5. Microsoft SQL Server 数据量大 导入导出 问题汇总

    问题一: 今天拿到一份有近百万条数据的Excel要导到数据库里面,我先在本地(2014)用自带Excel,然后生成脚本文件去服务器(2008)上执行:文件SQL打开不了. 解决方法: 用自带的sqlc ...

  6. lua的面向对象实现

    百度搜索一下,给出出的解决方案和学习帖子很多,可是我还是有很多的问题! (1)什么是面向对象? (2)lua中怎么实现面向对象? (3)什么样的实现既简单又能完成我的功能? (4)一定要按照c++的方 ...

  7. editplus 格式化 js、html、xml、css

    没有文件扩展”js”的脚本引擎的问题的解决办法 解决办法如下: 打开注册表编辑器,定位"HKEY_CLASSES_ROOT" > ".js" 这一项,双击 ...

  8. sql2005 和 mysql 定时备份批处理

    保存为sqlbak.bat  目录我直接放winrar 的根目录了 或者拷贝一个winrar.exe 具体目录随意. 然后添加计划任务个人的话建议一周或者一天 虚拟主机等 建议每周或者每月 @echo ...

  9. mysql 查询大量数据报错

    错误:Incorrect key file for table '/tmp/#sql_... 由于一次查询出大量数据,并且使用了临时表,导致产生此错误,主要是存放临时表文件的/tmp目录大小不足导致.

  10. python UI自动化实战记录七:页面2用例编写

    使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...