在这里我所说的从数据库对象转实体对象的自动实现,指的是DataTable自动转换好List<T>。
要实现这个功能,基于以下两点:
1:DataTable中列的名称和实体对象Entity中属性的名称同名(不区分大小写)。
2:当DataTable中的数值不能正确转换时(如为空的时候转为int)可指定Entity的默认值来避免错误发生。
主要用到了反射机制和特性。
代码如下
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
namespace 数据层
{
public class DataTableToListT
{
public static List<T> ToList<T>(DataTable dataTable)
{
List<T> list = null;
if (dataTable != null && dataTable.Rows.Count > 0)
{
list = new List<T>();
Type t = typeof(T);
PropertyInfo[] pinfo = t.GetProperties();
for (int i = 0; i < dataTable.Rows.Count; i++)
{
T item;
object objInstance = Activator.CreateInstance(t, true);
for (int j = 0; j < dataTable.Columns.Count; j++)
{
string colName = dataTable.Columns[j].ColumnName;
for (int k = 0; k < pinfo.Length; k++)
{
if (colName.Equals(pinfo[k].Name, StringComparison.OrdinalIgnoreCase))
{
object defaultvalue = null;
object[] proAttributes = pinfo[k].GetCustomAttributes(typeof(DataValueDefaultAttribute), false);
if (proAttributes.Length > 0)
{
DataValueDefaultAttribute loDefectTrack = (DataValueDefaultAttribute)proAttributes[0];
defaultvalue = loDefectTrack.Value;
}
pinfo[k].SetValue(objInstance, Map(pinfo[k].PropertyType.ToString(), dataTable.Rows[i][colName].ToString(), defaultvalue), null);
}
}
}
item = (T)objInstance;
list.Add(item);