快速反射DataTable
public class SetterWrapper<TTarget, TValue>
    {
        private Action<TTarget, TValue> _setter;
        public SetterWrapper(PropertyInfo propInfo)
        {
            if (propInfo == null)
                throw new ArgumentNullException("propertyInfo");
            if (!propInfo.CanWrite)
                throw new NotSupportedException("属性是只读或Private Setter");
            MethodInfo setMethod = propInfo.GetSetMethod(true);
            _setter = (Action<TTarget, TValue>)Delegate.CreateDelegate(typeof(Action<TTarget, TValue>), null, setMethod);
        }
        public void SetValue(TTarget target, TValue val)
        {
            if (_setter != null)
            {
                _setter(target, val);
            }
        }
    }
    public class GetterWrapper<TTarget, TValue>
    {
        private Func<TTarget, TValue> _getter;
        public GetterWrapper(PropertyInfo propInfo)
        {
            if (propInfo == null)
                throw new ArgumentNullException("propertyInfo");
            if (!propInfo.CanRead)
                throw new NotSupportedException("属性是不可读或Private Getter");
            MethodInfo getMethod = propInfo.GetGetMethod();
            _getter = (Func<TTarget, TValue>)Delegate.CreateDelegate(typeof(Func<TTarget, TValue>), null, getMethod);
        }
        public TValue GetValue(TTarget target)
        {
            if (_getter != null)
            {
                return _getter(target);
            }
            return default(TValue);
        }
    }
public class DataConvertHelperEx
    {
        /// <summary>
        /// 快速 Ilist<T> 转换成 DataTable
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static DataTable FastConvertToDataTable<T>(IList<T> i_objlist)
        {
            try
            {
                if (i_objlist == null || i_objlist.Count <= 0)
                {
                    return null;
                }
                DataTable dt = new DataTable(typeof(T).Name);
                DataColumn column;
                DataRow row;
                System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties();//System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
                foreach (T t in i_objlist)
                {
                    if (t == null)
                    {
                        continue;
                    }
                    row = dt.NewRow();
                    //for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
                    foreach (var pi in myPropertyInfo)
                    {
                        //System.Reflection.PropertyInfo pi = myPropertyInfo[i];
                        string name = pi.Name;
if (dt.Columns[name] == null)
                        {
                            //column = new DataColumn(name, pi.PropertyType);
                            column = new DataColumn(name);
                            dt.Columns.Add(column);
                        }
                        object val = null;
                        if (pi.PropertyType == typeof(string))
                        {
                            GetterWrapper<T, string> getter = new GetterWrapper<T, string>(pi);
                            val = getter.GetValue(t);
                        }
                        else if (pi.PropertyType == typeof(int))
                        {
                            GetterWrapper<T, int> getter = new GetterWrapper<T, int>(pi);
                            val = getter.GetValue(t);
                        }
                        else if (pi.PropertyType == typeof(float ))
                        {
                            GetterWrapper<T, float> getter = new GetterWrapper<T, float>(pi);
                            val = getter.GetValue(t);
                        }
                        else if (pi.PropertyType == typeof(DateTime))
                        {
                            GetterWrapper<T, DateTime> getter = new GetterWrapper<T, DateTime>(pi);
                            val = getter.GetValue(t);
                        }
                        else
                        {
                             val = pi.GetValue(t, null);                            
                        }
                        row[name] = val;// pi.GetValue(t, null);
                    }
                    dt.Rows.Add(row);
                }
                return dt;
            }
            catch(Exception ex)
            {
            }
            return DataConvertHelper.ConvertToDataTable<T>(i_objlist);
        }
    }
public static DataTable ConvertToDataTable<T>(IList<T> i_objlist)
        {
            if (i_objlist == null || i_objlist.Count <= 0)
            {
                return null;
            }
            DataTable dt = new DataTable(typeof(T).Name);
            DataColumn column;
            DataRow row;
            System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            foreach (T t in i_objlist)
            {
                if (t == null)
                {
                    continue;
                }
                row = dt.NewRow();
                for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
                {
                    System.Reflection.PropertyInfo pi = myPropertyInfo[i];
                    string name = pi.Name;
                    if (dt.Columns[name] == null)
                    {
                        //column = new DataColumn(name, pi.PropertyType);
                        column = new DataColumn(name);
                        dt.Columns.Add(column);
                    }
                    row[name] = pi.GetValue(t, null);
                }
                dt.Rows.Add(row);
            }
            return dt;
        }
快速反射DataTable的更多相关文章
- C# 快速反射 IL
		public class FastInvoke { public delegate object FastInvokeHandler(object target, object[] paramters ... 
- 【转载】C#通过Copy方法快速复制DataTable对象
		C#中的Datatable数据变量的操作过程中,可以通过DataTable的Copy方法快速复制当前的DataTable变量到新对象中,复制数据包含当前DataTable的结构信息如列名,同时也包含当 ... 
- 反射List<M> To DataTable|反射IList To DataTable|反射 DataTable To List<M>
		将DataTable集合反射获取 List<M> /// <summary> /// 根据DataTable集合反射获取 List<M> /// </summ ... 
- [源码]Literacy 快速反射读写对象属性,字段
		Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ... 
- 反射  DataTable拓展方法  转实体对象、实体集合、JSON
		Mapper类 using System; using System.Collections.Generic; using System.Data; using System.Globalizatio ... 
- SqlBulkCopy快速插入datatable到数据库中参考代码,以及要注意的问题
		参考代码如下: public class Examination { #region 批量插入一个sheet的专业对应的学科 /// <summary> /// 批量插入一个sheet的专 ... 
- 反射DataTable转实体类
		using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ... 
- c# 采用datatable 快速导入数据至MSSQL的方法分享
		转自:http://www.maomao365.com/?p=5613 摘要:下文讲述使用c#代码快速将dataTable导入至mssql数据库的方法 实现思路:需要将datatable调整为同目标表 ... 
- 【转载】C#通过Clone方法快速创建相同架构的DataTable
		在C#中的Datatable数据变量的操作过程中,如果需要克隆当前DataTable变量的结构,包括所有 DataTable 架构和约束等信息,可以使用DataTable中的Clone方法来实现,Cl ... 
随机推荐
- easyui datagrid 多行删除问题
			问题: var selected = $("#tbList").datagrid("getSelections"); selected的选中项 会包含上次已删掉 ... 
- C语言 文件操作7--文件错误处理
			//文件错误处理 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ... 
- nginx缓存模块配置总结proxy_cache(未完)
			简介:此缓存设置用到了第三方模块purge,使用的时候就在源链接和访问的具体内容之间加入关键字"/purge/"即可. 如:访问http://192.168.0.1/a.png 会 ... 
- JS调试加断点
			js在回调函数执行时直接就跳过了,想看下回调函数也看不了,调试的debug代码一时半会儿想不起来,找了几分钟找到了,还是记一下好. 1 debugger; 
- ASP.NET中进行消息处理(MSMQ) 一
			MSMQ是微软消息队列的英文缩写.那么什么是消息队列?这些介绍网上一大片这里就不多说了.本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧 ... 
- [vim]vim 在win下乱码解决
			vim在win下遇到汉字乱码早就知晓,本以为通过如下设置即可解决乱码问题 set encoding=utf-8 set fileencoding=utf-8,chinese 这样设置是可以解决源码文件 ... 
- Orchard用LiveWriter写博客
			本文链接:http://www.cnblogs.com/souther/p/4544241.html Orchard本身提供一个内建的管理面板来写博客,许多人更喜欢采用客户端提交的方式,例如Windo ... 
- Mustache.js前端模板引擎源码解读
			mustache是一个很轻的前端模板引擎,因为之前接手的项目用了这个模板引擎,自己就也继续用了一会觉得还不错,最近项目相对没那么忙,于是就抽了点时间看了一下这个的源码.源码很少,也就只有六百多行,所以 ... 
- windows API 开发飞机订票系统 图形化界面 (一)
			去年数据结构课程设计的作品,c语言实现,图形化界面使用windows API实现. 首发在我csdn博客:http://blog.csdn.net/u013805360/article/details ... 
- 一个HTML5老兵坦言:我们真的需要“小程序”么?
			在PC时代,浏览器成为互联网信息的入口,并非因为它支持了HTML技术,而是因为它给人类带来了“世界是平的”的空间和理念,人类历史上第一次实现了信息的互联互通. 今天,微信虽然用了HTML5技术来做应用 ... 
