using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Contract.Domain;
using DevExpress.Data;
using Framework;
using Holworth.Utility;
using HraWeb.Common;
using Holworth.RiskInterface;
using System.Net;
using System.IO;
using System.Text;
using Contract.IService;
using HraModel;
using NPOI.SS.Formula.Functions;
using Oracle.DataAccess.Client;
using OracleConnection = System.Data.OracleClient.OracleConnection;
using System.Collections;
using System.Text.RegularExpressions;
using Match = System.Text.RegularExpressions.Match;
using HraWeb.ReportEg.To38Validate.Validate;
using Microsoft.CSharp;

namespace HraWeb
{
public static class ListAndTableExtension
{
#region 集合转为对应的DataTable

/// <summary>
///List转换为DataTable
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="list"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(this List<T> list) where T : new()
{
DataTable table = new DataTable();
PropertyInfo[] ps = typeof(T).GetProperties();
foreach (PropertyInfo p in ps)
{
if (!p.PropertyType.IsGenericType)
{
table.Columns.Add(ConvertToTableColumnName(p.Name), p.PropertyType);

}
else
{
Type GenericTypeDefinition = p.PropertyType.GetGenericTypeDefinition();
if (GenericTypeDefinition == typeof(Nullable<>))
{
table.Columns.Add(ConvertToTableColumnName(p.Name), Nullable.GetUnderlyingType(p.PropertyType));

}
}
}
foreach (T obj in list)
{
DataRow row = table.NewRow();
foreach (PropertyInfo p in ps)
{

row[ConvertToTableColumnName(p.Name)] = p.GetValue(obj, null);

}
table.Rows.Add(row);

}
return table;

}

#endregion

#region 扩展方法 DataTable转为对应实体的List集合

public static List<T> ToList<T>(this DataTable table) where T : new()
{
List<T> list = new List<T>();
PropertyInfo[] ps = typeof(T).GetProperties();
foreach (DataRow row in table.Rows)
{
T obj = new T();
foreach (DataColumn col in table.Columns)
{
foreach (PropertyInfo p in ps)
{
if (p.Name == ConvertToEntityColumnName(col.ColumnName))
{
if (!p.PropertyType.IsGenericType)
{
p.SetValue(obj,
string.IsNullOrEmpty(row[col.ColumnName].ToString())
? null
: Convert.ChangeType(row[col.ColumnName].ToString(), p.PropertyType), null);

}
else
{
if (p.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
p.SetValue(obj,
string.IsNullOrEmpty(row[col.ColumnName].ToString())
? null
: Convert.ChangeType(row[col.ColumnName],
Nullable.GetUnderlyingType(p.PropertyType)), null);

}
}

}
}

}
list.Add(obj);
}
return list;
}

#endregion

#region 列名转为对应实体类的属性名

public static string ConvertToEntityColumnName(string name)
{

List<string> strList = name.Split('_').ToList();
StringBuilder sb = new StringBuilder();
foreach (string s2 in strList)
{
sb.Append(ReplaceString(s2));
}
return sb.ToString();
}

public static string ReplaceString(string s)
{
return Regex.Replace(s, (string)@"([A-Za-z]{1})([A-Za-z]*)", (MatchEvaluator)MathcEval);

}

private static string MathcEval(Match match)
{
return match.Groups[1].Value.ToUpper() + match.Groups[2].Value.ToLower();
}

#endregion
public static IList ToGenericList(this DataTable dataTable)
{
Type GenericType = ListAndTableExtension.InitEntityType(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);
}
values[index++] = itemValue;
}

list.Add(constructor.Invoke(values));

}
return list;
}
#region 属性名转换为数据库对应的列名

//属性名转换为数据库对应的列名
public static string ConvertToTableColumnName(string name)
{
name = Regex.Replace(name, @"([A-Z]{1})([a-z]*)", MatchEval);
name = name.TrimEnd('_');
return name;
}

private static string MatchEval(Match match)
{
return match.Groups[1].Value.ToUpper() + match.Groups[2].Value.ToUpper() + "_";
}

private static Type InitEntityType(DataTable table)
{
CSharpCodeProvider p = new CSharpCodeProvider();
CompilerParameters param = new CompilerParameters();
string s = "namespace __ns" +
"{" +
"public class AAA";
//"{ public AAA(string Name,int ID,string GuidType){this.Name=Name;this.ID=ID;this.GuidType=GuidType;}" +
//" public string Name{ get;set; }" +
//" public int ID{get;set;}" +
//" public string GuidType{get;set;}" +
s += "{ " +
"public AAA(";
for (int i = 0; i < table.Columns.Count;i++)
{

s += "string " + table.Columns[i].ColumnName+",";

}
s = s.TrimEnd(',')+"){";
for (int i = 0; i < table.Columns.Count; i++)
{
s += "this." + table.Columns[i].ColumnName + "="+table.Columns[i].ColumnName+";";
}
s += "}";
for (int i = 0; i < table.Columns.Count; i++)
{
string columnName = table.Columns[i].ColumnName;
s += " public string " + columnName + " {get;set;}\r\n";
}
s +=" }}\r\n";

List<object> objs = new List<object>();
for (int i = 0; i < table.Columns.Count; i++)
{
objs.Add("");
}

CompilerResults rel = p.CompileAssemblyFromSource(param, s);
Type t = rel.CompiledAssembly.GetType("__ns.AAA");

object o = t.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.OrderBy(c => c.GetParameters().Length).First().Invoke(objs.ToArray());

return o.GetType();
}

public static void TestMethod()
{
var entity = new { Name = "item", ID = 0, GuidType = "" };

DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("GuidType", typeof(string));

for (int i = 0; i < 10; i++)
{
DataRow dr = dataTable.NewRow();
dr["Name"] = "STRING" + i;
dr["ID"] = i;
if (i % 2 == 0)
dr["GuidType"] = "GuidType" + i;
else
{
dr["GuidType"] = DBNull.Value;
}
dataTable.Rows.Add(dr);
}

IList list = dataTable.ToGenericList();
}

#endregion

}
}

DataTable 转换成匿名集合类的更多相关文章

  1. DataTable转换成匿名类的List类型

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

  2. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

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

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

  4. asp.net dataTable转换成Json格式

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  5. 将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...

  6. 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)

    public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...

  7. C#将DataTable转换成list的方法

    本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </su ...

  8. DataTable转换成List<T>

    很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...

  9. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

随机推荐

  1. CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)

    http://www.jb51.net/article/58843.htm 一.安装Email发送程序 复制代码 代码如下: yum install sendmail mutt 二.安装FTP客户端程 ...

  2. (转)java.lang.RuntimeException: Missing type parameter

    java.lang.RuntimeException: Missing type parameter (2015-04-07 14:35:51)   分类: 技术 程序中用到了gson的new typ ...

  3. SQL Server数据库优化经验总结

    优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert, ...

  4. 浅谈对【OSI七层协议】的理解

    我们每天都在上网冲浪,在这背后到底有那些设备.协议去支撑呢?ISO是[Open System Interconnection]的缩写,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本 ...

  5. ubuntu 源更新(sources.list)

    首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开(也可以复制到Windows下打 ...

  6. HAProxy安装配置用于TCP的负载均衡

    HaProxy介绍 Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备.虚拟主机.基于TCP和HTTP应用代理等功能.其配置简单,而且拥有很好的对服务器节点的健康检 ...

  7. juc线程池原理(六):jdk线程池中的设计模式

    一.jdk中默认线程池中的代理模式 单例类线程池只有一个线程,无边界队列,适合cpu密集的运算.jdk中创建线程池是通过Executors类中提供的静态的方法来创建的,其中的单例类线程池的方法如下: ...

  8. MySQL的Innodb缓存相关优化

    MySQL的Innodb缓存相关优化 INNODB 状态的部分解释 通过 命令 SHOW STATUS LIKE  'Innodb_buffer_pool_%' 查看  Innodb缓存使用率  (I ...

  9. 基于LVS的负载均衡实现

    一 什么是负载均衡 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务 ...

  10. 什么是闭包?在js中的作用是什么?

    闭包就是讲函数内部生成的变量保存到内存中,进行下次调用:也可以说函数外不可以调用函数内部的变量: 当函数内部返回一个函数时,闭包搭建了方法内部与方法外部的桥梁,使得外部也可以任意的获取到方法内部的资源 ...