现在的位置: 首页 > 综合 > 正文

DataTable转换成IList

2013年10月16日 ⁄ 综合 ⁄ 共 3323字 ⁄ 字号 评论关闭

作者:陈太汉

DataTable转换成IList

在用C#作开发的时候经常要把DataTable转换成IList;操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便。

注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.ToLower().Contains(实体属性名.ToLower())

          数据类型暂时至支持int、string、DateTime、float、double

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace TBToListTest
{
    public class TBToList<T> where T : new()
    {
        /// <summary>
        /// 获取列名集合
        /// </summary>
        private IList<string> GetColumnNames(DataColumnCollection dcc)
        {
            IList<string> list = new List<string>();
            foreach (DataColumn dc in dcc)
            {
                list.Add(dc.ColumnName);
            }
            return list;
        }

        /// <summary>
        ///属性名称和类型名的键值对集合
        /// </summary>
        private Hashtable GetColumnType(DataColumnCollection dcc)
        {
            if (dcc == null || dcc.Count == 0)
            {
                return null;
            }
            IList<string> colNameList = GetColumnNames(dcc);

            Type t = typeof(T);
            PropertyInfo[] properties = t.GetProperties();
            Hashtable hashtable = new Hashtable();
            int i = 0;
            foreach (PropertyInfo p in properties)
            {
                foreach (string col in colNameList)
                {
                    if (col.ToLower().Contains(p.Name.ToLower()))
                    {
                        hashtable.Add(col, p.PropertyType.ToString() + i++);
                    }
                }
            }

            return hashtable;
        }

        /// <summary>
        /// DataTable转换成IList
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public IList<T> ToList(DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
            {
                return null;
            }

            PropertyInfo[] properties = typeof(T).GetProperties();//获取实体类型的属性集合
            Hashtable hh = GetColumnType(dt.Columns);//属性名称和类型名的键值对集合
            IList<string> colNames = GetColumnNames(hh);//按照属性顺序的列名集合
            List<T> list = new List<T>();
            T model = default(T);
            foreach (DataRow dr in dt.Rows)
            {
                model = new T();//创建实体
                int i = 0;
                foreach (PropertyInfo p in properties)
                {
                    if (p.PropertyType == typeof(string))
                    {
                        p.SetValue(model, dr[colNames[i++]], null);
                    }
                    else if (p.PropertyType == typeof(int))
                    {
                        p.SetValue(model, int.Parse(dr[colNames[i++]].ToString()), null);
                    }
                    else if (p.PropertyType == typeof(DateTime))
                    {
                        p.SetValue(model, DateTime.Parse(dr[colNames[i++]].ToString()), null);
                    }
                    else if (p.PropertyType == typeof(float))
                    {
                        p.SetValue(model, float.Parse(dr[colNames[i++]].ToString()), null);
                    }
                    else if (p.PropertyType == typeof(double))
                    {
                        p.SetValue(model, double.Parse(dr[colNames[i++]].ToString()), null);
                    }
                }

                list.Add(model);
            }

            return list;
        }

        /// <summary>
        /// 按照属性顺序的列名集合
        /// </summary>
        private IList<string> GetColumnNames(Hashtable hh)
        {
            PropertyInfo[] properties = typeof(T).GetProperties();//获取实体类型的属性集合
            IList<string> ilist = new List<string>();
            int i = 0;
            foreach (PropertyInfo p in properties)
            {
                ilist.Add(GetKey(p.PropertyType.ToString() + i++, hh));
            }
            return ilist;
        }

        /// <summary>
        /// 根据Value查找Key
        /// </summary>
        private string GetKey(string val, Hashtable tb)
        {
            foreach (DictionaryEntry de in tb)
            {
                if (de.Value.ToString() == val)
                {
                    return de.Key.ToString();
                }
            }
            return null;
        }
          
    }
}








namespace TBToListTest
{

   //实体
    public class Person
    {
        public int ID
        {
            set;
            get;
        }

        public string Name
        {
            set;
            get;
        }

        public string Age
        {
            set;
            get;
        }

        public string Lover
        {
            set;
            get;
        }

    }
}




using System;
using System.Data;

namespace TBToListTest
{
    class Program
    {
        static void Main(string[] args)
        {
            TBToList<Person> tol = new TBToList<Person>();
            Console.WriteLine();
            DataTable dt =  GetTable();
            tol.ToList(dt);
            Console.Read();
        }

        public static DataTable GetTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("Age");
            dt.Columns.Add("Lover");
            dt.Columns.Add("Name");
            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Age"] = "Age1";
            dr["Lover"] = "Lover1";
            dr["Name"] = "Name1";
            dt.Rows.Add(dr);
            DataRow dr1 = dt.NewRow();
            dr1["ID"] = 2;
            dr1["Age"] = "Age2";
            dr1["Lover"] = "Lover2";
            dr1["Name"] = "Name2";
            dt.Rows.Add(dr1);
            return dt;
        }
    }
}

作者:陈太汉
出处:http://hlxs.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载

抱歉!评论已关闭.