DataTable转换成匿名类的List类型
DataTable转换成匿名类的List类型
因为匿名类是不能够 Activator.CreateInstance进行反射实例化的

/// <summary> /// 匿名类的转换方式 /// </summary> /// <param name="GenericType"></param> /// <param name="dataTable"></param> /// <returns></returns> public static IList FromTable(Type GenericType, DataTable dataTable) { Type typeMaster = typeof(List<>); Type listType = typeMaster.MakeGenericType(GenericType); IList list = Activator.CreateInstance(listType) as IList; if (dataTable == null || dataTable.Rows.Count == 0) return list; var constructor = GenericType.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .OrderBy(c => c.GetParameters().Length).First(); var parameters = constructor.GetParameters(); var values = new object[parameters.Length]; foreach (DataRow dr in dataTable.Rows) { int index = 0; foreach (ParameterInfo item in parameters) { object itemValue = null; if (dr[item.Name] != null && dr[item.Name] != DBNull.Value) { itemValue = Convert.ChangeType(dr[item.Name], item.ParameterType.GetUnderlyingType()); } values[index++] = itemValue; } list.Add(constructor.Invoke(values)); } return list; } /// <summary> /// 匿名类的转换方式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dataTable"></param> /// <returns></returns> public static List<T> FromTable<T>(DataTable dataTable) { List<T> list = new List<T>(); if (dataTable == null || dataTable.Rows.Count == 0) return list; //取当前匿名类的构造函数 var constructor = typeof(T).GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .OrderBy(c => c.GetParameters().Length).First(); //取当前构造函数的参数 var parameters = constructor.GetParameters(); var values = new object[parameters.Length]; foreach (DataRow dr in dataTable.Rows) { int index = 0; foreach (ParameterInfo item in parameters) { object itemValue = null; if (dr[item.Name] != null) { itemValue = Convert.ChangeType(dr[item.Name], item.ParameterType.GetUnderlyingType()); } values[index++] = itemValue; } T entity = (T)constructor.Invoke(values); list.Add(entity); } return list; }

使用方法

var entity = new { Name = "item", ID = 0, GuidType = Guid.Empty }; DataTable dataTable = new DataTable(); dataTable.Columns.Add("Name", typeof(string)); dataTable.Columns.Add("ID", typeof(int)); dataTable.Columns.Add("GuidType", typeof(Guid)); for (int i = 0; i < 10; i++) { DataRow dr = dataTable.NewRow(); dr["Name"] = "STRING" + i; dr["ID"] = i; if (i % 2 == 0) dr["GuidType"] = Guid.Empty; else { dr["GuidType"] = DBNull.Value; } dataTable.Rows.Add(dr); } IList list = EntityExtensions.FromTable(entity.GetType(), dataTable);

DataTable转换成匿名类的List类型的更多相关文章
- DataTable 转换成匿名集合类
using System;using System.CodeDom.Compiler;using System.Collections.Generic;using System.Data;using ...
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- DataTable 转换成 Json的3种方法
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...
- DataTable转换成IList<T>的简单实现
DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...
- C#将DataTable转换成list的方法
本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary> /// 酒店评论列表-分页 /// </su ...
- 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据
领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...
- 简单的反射 把datatable 转换成list对象
/// <summary> /// 把datatable 转换成list对象 /// </summary> /// <typeparam name="T&quo ...
- C# 中 DataTable转换成IList
在用C#作开发的时候经常要把DataTable转换成IList:操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便. 注意:实体的 ...
随机推荐
- 操作系统介绍、python基础
操作系统 什么是操作系统? 操作系统位于计算机硬件与应用软件之间,是一个协调.管理.控制计算机硬件资源与软件资源的控制程序. 2.为何要操作系统 ① .控制硬件 ② .把对硬件的复杂的操作封装成 ...
- [WikiOI "天梯"1281] Xn数列
题目描述Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描 ...
- 测试 markdown
PHP 标量类型与返回值类型声明 标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式. PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类 ...
- Semaphore(信号量)源码分析
1. Semaphore Semaphore和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer共享排队的方式实现. 关 ...
- Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表
A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...
- Linux虚拟化技术KVM、QEMU与libvirt的关系(转)
说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助.当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标 ...
- CentOS更新Python版本,同时修复yum不能使用的问题
转自:Li_Hanx博客 遇到问题,需要更新python,网上找了好多都不能顺利更新,找到这位大佬的这篇博客,写的非常好,分享给大家. 发现一个新办法,那就是直接安装另一个版本的Python,比如Py ...
- Apache静态编译与动态编译详解
Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的“动态”和“静态”两种编译安装方式: 静态编译: 编译的时 ...
- dotnet若干说明图片
- 回顾苹果操作系统Mac OS的发展历史
在新的MacBook AIR和Mac OS X Lion即将发布之际,我们仅以此文向伟大的苹果和乔布斯致敬.并祝Apple教主乔布斯早日康复,长命百岁,千秋万载,一统苹果! Mac OS是指运行于苹果 ...