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的元素,操作起来就非常方便. 注意:实体的 ...
随机推荐
- python3-开发进阶Django-form组件中model form组件
Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...
- [JZOJ3484]密码
题目大意: 给你一个很长的字符串a(|a|<=300000),一个比较短的字符串b(|b|<=200),请你搞一些破坏. 你可以从a的两边去掉一些字符使得b仍是a的一个字串,问有多少种方案 ...
- 83.(01背包)CYD刷题
3130 CYD刷题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 下午,CYD要刷题了,已知CY ...
- JS小游戏寻找房祖名
提示:1:先把两个图片放到重命名并放到相应的路径内. 2:本小游戏只为闲事练手,如有小bug自行解决,解决不了的可以留言,我看到后解决. 代码如下: <!DOCTYPE html>< ...
- Android应用程序的解析
一: 文件架构 二: 图片,语音资源的使用 图片的两种使用方法: 第一种: 使用imageView控件 <ImageView android:id="@+id/imageView1&q ...
- HDU 1864 Brave Game 【组合游戏,SG函数】
简单取石子游戏,SG函数的简单应用. 有时间将Nim和.SG函数总结一下……暂且搁置. #include <cstdio> #include <cstring> #define ...
- mysql分裤分表
1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表mem ...
- Scut快速开发
1 开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a) IIS和消息队列(MSMQ) b) 数据库,Sql2005以上版本 c) V ...
- PVS-Studio静态通用分析规则
通用分析 PVS - Studio产品包含了一套通用静态分析规则,用于检测在C / C ++/ C+11应用程序中大范围内的各种缺陷. 通用的规则集帮助您发现逻辑错误,拼写错误,导致访问冲突的代码片段 ...
- List of regional organizations by population
https://baike.baidu.com/item/国际组织/261053?fr=aladdin 经济文化类组织(非政府组织) 创行 狮子会 全球青年领导力联盟 乐施会 政治类组织 欧洲联盟(欧 ...