一般情况下我们在得到从数据库里面查出的表的时候都习惯性的用foreach去循环遍历datatable的Rows然后根据索引或者行数+列名称的形式取
这样有两个缺点
一,步骤繁琐,不适用于多表多字段的情况
二,如果数据库表有改动,又要重新写,会很麻烦,没有拓展性.
如何解决这样的情况呢?
下面我们就进入正题,自己写一个工具类来完成上面的操作:
--------------------------------------------------------------------------------------
public class TableToList
{
#region DatatableToList
/// <summary>
/// 将DataTable转换为List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataTable">数据库返回的表</param>
/// <returns></returns>
public static List<T> DataTableToList<T>(DataTable dataTable)
{
List<T> list = new List<T>();
//获取T的类型信息
Type type = typeof(T);
//获取T的所有属性
PropertyInfo[] allProperties = type.GetProperties();
foreach (DataRow row in dataTable.Rows)
{
T obj = Activator.CreateInstance<T>();
//为obj的所有属性赋值
foreach (PropertyInfo property in allProperties)
{
try
{
//获取该行指定列的值
object value = row[property.Name];
//为Obj对象的指定属性赋值
if (value == DBNull.Value)
{
property.SetValue(obj, "", null);
}
else
{
property.SetValue(obj, value, null);
}
}
catch { }
}
list.Add(obj);
}
return list;
}
#endregion
上图:
----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
#region dt转换床model实体
/// <summary>
/// dt转换床model实体
/// </summary>
/// <param name="dt"></param>
/// <param name="model">数据库返回的表</param>
/// <returns></returns>
public static object GetModel(DataTable dt, object model)
{
foreach (DataRow row in dt.Rows)
{
foreach (var item in model.GetType().GetProperties())
{
if (row.Table.Columns.Contains(item.Name))
{
if (DBNull.Value != row[item.Name])
{
item.SetValue(model, Convert.ChangeType(row[item.Name], item.PropertyType), null);
}
}
}
}
return model;
}
#endregion
上图:
------------------------------------------------------------------------------------------------------------------------------------------
}
这样我们再去遍历的时候就会很方便了,无论数据库怎么更改都能遍历出来.是不是很方便呢...