本文转载自http://blog.csdn.net/chentaihan/article/details/6407284数据库
做者:陈太汉ide
在用C#做开发的时候常常要把DataTable转换成IList;操做DataTable比较麻烦,把DataTable转换成IList,以对象实体做为IList的元素,操做起来就很是方便。编码
注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.ToLower().Contains(实体属性名.ToLower())spa
数据类型暂时只支持int、string、DateTime、float、double.net
- 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;
- }
- }
- }
DataTable转换成IList初版出来以后,昨晚老是以为有不少地方能够改进,因此今天一大早来就把它给修订了,固然还有一些地方能够改进,等我之后编码能力提升以后再出第三版吧,第二版应该够用orm
对象
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Collections;
- using System.Data;
- namespace JSONTest
- {
- public class TableToList<T> where T : new()
- {
- /// <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();//获取实体类型的属性集合
- IList<string> colNames = GetColumnNames(dt.Columns);//按照属性顺序的列名集合
- 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(bool))
- {
- p.SetValue(model, bool.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(DataColumnCollection dcc)
- {
- PropertyInfo[] properties = typeof(T).GetProperties();//获取实体类型的属性集合
- //因为集合中的元素是肯定的,因此能够指定元素的个数,系统就不会分配多余的空间,效率会高点
- IList<string> ilist = new List<string>(dcc.Count);
- foreach (PropertyInfo p in properties)
- {
- foreach (DataColumn dc in dcc)
- {
- if (dc.ColumnName.ToLower().Contains(p.Name.ToLower()))
- {
- ilist.Add(dc.ColumnName);
- }
- }
- }
- return ilist;
- }
- }
- }