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
;
}
}
}