DataTable 转换成匿名集合类
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 转换成匿名集合类的更多相关文章
- DataTable转换成匿名类的List类型
		DataTable转换成匿名类的List类型 因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ... 
- DataTable 转换成 Json的3种方法
		在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ... 
- DataTable转换成IList<T>的简单实现
		DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ... 
- asp.net dataTable转换成Json格式
		/// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ... 
- 将DataTable转换成CSV文件
		DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ... 
- 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)
		public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ... 
- C#将DataTable转换成list的方法
		本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary> /// 酒店评论列表-分页 /// </su ... 
- DataTable转换成List<T>
		很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ... 
- 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据
		领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ... 
随机推荐
- SCARA——OpenGL入门学习三
			OpenGL入门学习[三] 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处.例如:点太小,难以看清楚:直线也太细,不舒服:或者想画虚线,但不知道方法只能用 ... 
- 关于 avalon总线理解(整理)
			1,一个基于Avalon接口的系统会包含很多功能模块,这些功能模块就是Avalon存储器映射外设,通常简称Avalon外设.所谓存储器映射外设是指外设和存储器使用相同的总线来寻址,并且CPU使用访问存 ... 
- js插件大全 jquery插件大全
			CocoaUI - 一个强大的 iOS UI 框架 http://www.cocoaui.com/ tab,slider,轮播不错的说 http://www.superslide2.com/index ... 
- 在android开发中添加外挂字体
			1.在项目目录中,右键app——New——Folder—— Assets Folder 2.把.ttf或者.oft文件拷进这个assets文件夹 3.在onCreate()中 Typeface typ ... 
- Vue.js:安装
			ylbtech-Vue.js:安装 1.返回顶部 1. Vue.js 安装 1.独立版本 我们可以在 Vue.js 的官网上直接下载 vue.min.js 并用 <script> 标签引入 ... 
- 微信小程序生成太阳码
			微信小程序生成太阳码 https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=access_token 必须通过POST提交 而且参数 ... 
- django-上传文件 fromdata(头像实例)
			上传文件头像的2种方法,简单实例来看下用法 用法定义,fromdata可以传输任何数据 HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息. FILES 中的每个键为&l ... 
- 移植OpenWrt到CuHead Pro WiFi
			移植OpenWrt到CuHead Pro WiFi Posted by: zou, baozhu , 三月 13, 2014 CuHead Pro是一款路由器开发板,下面是开发板的配置信息. 名称 型 ... 
- 如何卸载win10的自带应用
			win10自带了好多应用,有些看起来不错,其实用起来不太方便哈(我的个人感觉),我们都更喜欢第三方应用,所以我们就来看看如何卸载这些自带应用.如图,是卸载完成后的Windows PowerShell: ... 
- <%@ page import=""%>的用法
			转自:https://blog.csdn.net/huihui870311/article/details/455642111 <jsp:directive.page import=" ... 
