C#实现DataTable转换成IList的方法
本文实例讲述了C#实现DataTable转换成IList的方法。分享给大家供大家参考,具体如下:
在用C#作开发的时候经常要把DataTable转换成IList;操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便。
注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.ToLower().Contains(实体属性名.ToLower())
数据类型暂时至支持int、string、DateTime、float、double
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Data;
usingSystem.Reflection;
namespaceTBToListTest
{
publicclassTBToList<T>whereT:new()
{
///<summary>
///获取列名集合
///</summary>
privateIList<string>GetColumnNames(DataColumnCollectiondcc)
{
IList<string>list=newList<string>();
foreach(DataColumndcindcc)
{
list.Add(dc.ColumnName);
}
returnlist;
}
///<summary>
///属性名称和类型名的键值对集合
///</summary>
privateHashtableGetColumnType(DataColumnCollectiondcc)
{
if(dcc==null||dcc.Count==0)
{
returnnull;
}
IList<string>colNameList=GetColumnNames(dcc);
Typet=typeof(T);
PropertyInfo[]properties=t.GetProperties();
Hashtablehashtable=newHashtable();
inti=0;
foreach(PropertyInfopinproperties)
{
foreach(stringcolincolNameList)
{
if(col.ToLower().Contains(p.Name.ToLower()))
{
hashtable.Add(col,p.PropertyType.ToString()+i++);
}
}
}
returnhashtable;
}
///<summary>
///DataTable转换成IList
///</summary>
///<paramname="dt"></param>
///<returns></returns>
publicIList<T>ToList(DataTabledt)
{
if(dt==null||dt.Rows.Count==0)
{
returnnull;
}
PropertyInfo[]properties=typeof(T).GetProperties();//获取实体类型的属性集合
Hashtablehh=GetColumnType(dt.Columns);//属性名称和类型名的键值对集合
IList<string>colNames=GetColumnNames(hh);//按照属性顺序的列名集合
List<T>list=newList<T>();
Tmodel=default(T);
foreach(DataRowdrindt.Rows)
{
model=newT();//创建实体
inti=0;
foreach(PropertyInfopinproperties)
{
if(p.PropertyType==typeof(string))
{
p.SetValue(model,dr[colNames[i++]],null);
}
elseif(p.PropertyType==typeof(int))
{
p.SetValue(model,int.Parse(dr[colNames[i++]].ToString()),null);
}
elseif(p.PropertyType==typeof(DateTime))
{
p.SetValue(model,DateTime.Parse(dr[colNames[i++]].ToString()),null);
}
elseif(p.PropertyType==typeof(float))
{
p.SetValue(model,float.Parse(dr[colNames[i++]].ToString()),null);
}
elseif(p.PropertyType==typeof(double))
{
p.SetValue(model,double.Parse(dr[colNames[i++]].ToString()),null);
}
}
list.Add(model);
}
returnlist;
}
///<summary>
///按照属性顺序的列名集合
///</summary>
privateIList<string>GetColumnNames(Hashtablehh)
{
PropertyInfo[]properties=typeof(T).GetProperties();//获取实体类型的属性集合
IList<string>ilist=newList<string>();
inti=0;
foreach(PropertyInfopinproperties)
{
ilist.Add(GetKey(p.PropertyType.ToString()+i++,hh));
}
returnilist;
}
///<summary>
///根据Value查找Key
///</summary>
privatestringGetKey(stringval,Hashtabletb)
{
foreach(DictionaryEntrydeintb)
{
if(de.Value.ToString()==val)
{
returnde.Key.ToString();
}
}
returnnull;
}
}
}
namespaceTBToListTest
{
//实体
publicclassPerson
{
publicintID
{
set;
get;
}
publicstringName
{
set;
get;
}
publicstringAge
{
set;
get;
}
publicstringLover
{
set;
get;
}
}
}
usingSystem;
usingSystem.Data;
namespaceTBToListTest
{
classProgram
{
staticvoidMain(string[]args)
{
TBToList<Person>tol=newTBToList<Person>();
Console.WriteLine();
DataTabledt=GetTable();
tol.ToList(dt);
Console.Read();
}
publicstaticDataTableGetTable()
{
DataTabledt=newDataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Age");
dt.Columns.Add("Lover");
dt.Columns.Add("Name");
DataRowdr=dt.NewRow();
dr["ID"]=1;
dr["Age"]="Age1";
dr["Lover"]="Lover1";
dr["Name"]="Name1";
dt.Rows.Add(dr);
DataRowdr1=dt.NewRow();
dr1["ID"]=2;
dr1["Age"]="Age2";
dr1["Lover"]="Lover2";
dr1["Name"]="Name2";
dt.Rows.Add(dr1);
returndt;
}
}
}
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。