完美支持List与DataTable互转

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;

namespace Common
{


    /// <summary>   
    /// 实体转换辅助类   
    /// </summary>   
    public class DataTable2List<T> where T : new()
    {
        public static List<T> ConvertToModel(DataTable dt)
        {
            // 定义集合   
            List<T> ts = new List<T>();

            // 获得此模型的类型  
            Type type = typeof(T);
            string tempName = "";

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = new T();
                // 获得此模型的公共属性     
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;  // 检查DataTable是否包含此列   
                    if (dt.Columns.Contains(tempName))
                    {

                        // 判断此属性是否有Setter     
                        if (!pi.CanWrite) continue;

                        object value = dt.Rows[i][tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                ts.Add(t);
            }
            return ts;
        }
    }

    public class List2DataTable<T>
    {
        readonly static List<Type> types = new List<Type>()
        {
            typeof(bool),typeof(int),typeof(double),typeof(decimal),
            typeof(float),typeof(long)
        };
        public static DataTable ToDataTable(List<T> items)
        {

            DataTable dataTable = new DataTable(typeof(T).Name);

            //Get all the properties

            PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (PropertyInfo prop in Props)
            {
                Type colType = prop.PropertyType;
                //完美解决方案,可排除DATASET不支持System.Nullable错误
                if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                {

                    colType = colType.GetGenericArguments()[0];

                }

                dataTable.Columns.Add(prop.Name, colType);
            }

            foreach (T item in items)
            {
                if (item != null)
                {
                    DataRow dr = dataTable.NewRow();

                    foreach (PropertyInfo p in Props)
                    {
                        //If struct type
                        if (types.IndexOf(p.PropertyType) >= 0)
                        {
                            dr[p.Name] = p.GetValue(item, null);
                        }
                        else
                        {
                            dr[p.Name] = p.GetValue(item, null) ?? DBNull.Value;
                        }
                    }

                    dataTable.Rows.Add(dr);
                }
            }

            return dataTable;

        }
    }



}




获得查询结果
// DataTable dt = DbHelper.ExecuteDataTable(...);
把DataTable转换为IList<UserInfo>
// IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值