DataTable 转换为List 集合
/// <summary>
/// DataTable 转换为List 集合
/// </summary>
/// <typeparam name="TResult">类型</typeparam>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt) where T : class,new()
{
//创建一个属性的列表
List<PropertyInfo> prlist = new List<PropertyInfo>();
//获取TResult的类型实例 反射的入口
Type t = typeof(T);
//获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
//创建返回的集合
List<T> oblist = new List<T>();
foreach (DataRow row in dt.Rows)
{
//创建TResult的实例
T ob = new T();
//找到对应的数据 并赋值
//prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
prlist.ForEach(p =>
{
if (row[p.Name] != DBNull.Value)
{
p.SetValue(ob, row[p.Name], null);
}
else
{
if (p.PropertyType == typeof(string))
{
p.SetValue(ob, string.Empty, null);
}
}
});
//放入到返回的集合中.
oblist.Add(ob);
}
return oblist;
}
List<T>转DataTable
public static class ListExtension
{
public static DataTable ListConvertDataTable<T>(List<T> model, string TableName) where T : class
{
try
{
Type value = typeof(T);
List<PropertyInfo> list = new List<PropertyInfo>(value.GetProperties()); //属性列表
DataTable table = new DataTable();//实例化datatable
table.TableName = TableName; //表名
foreach (var property in list)
{
//获取属性数据类型
Type PropertyType = property.PropertyType;
//验证数据类型是否为空
if (PropertyType.IsGenericType && PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
PropertyType = property.PropertyType.GetGenericArguments()[0];
}
table.Columns.Add(property.Name, PropertyType);
}
foreach (var dataValue in model)
{
DataRow row = table.NewRow();
list.ForEach(p => { row[p.Name] = p.GetValue(dataValue); });
table.Rows.Add(row);
}
return table;
}
catch (Exception ex)
{
return null;
}
}
}
讲DataRow转成Model
/// <summary>
/// DataRow 转换成 Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dr"></param>
/// <returns></returns>
public static T ConvertToModel<T>(this System.Data.DataRow dr) where T : new()
{
T model = new T();
foreach (PropertyInfo pInfo in model.GetType().GetProperties())
{
object val = getValueByColumnName(dr, pInfo.Name);
pInfo.SetValue(model, val, null);
}
return model;
}
/// <summary>
/// 获取该列的值
/// </summary>
/// <param name="dr"></param>
/// <param name="columnName"></param>
/// <returns></returns>
public static object getValueByColumnName(System.Data.DataRow dr, string columnName)
{
if (dr.Table.Columns.IndexOf(columnName) >= 0)
{
if (dr[columnName] == DBNull.Value)
{
return null;
}
return dr[columnName];
}
return null;
}