using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace CloudBuilder.Core.Utility
{
public class DataTableConvertor
{
///
/// DataTable转对象
///
///
///
public static List ConvertToList(DataTable dt) where T : new()
{
// 定义集合
var list = new List();
if (dt == null || 0 == dt.Rows.Count)
{
return list;
}
// 获得此模型的可写公共属性
IEnumerable propertys = typeof(T).GetProperties().Where(u => u.CanWrite);
list = ConvertToEntity(dt, propertys);
return list;
}
private static List ConvertToEntity(DataTable dt, IEnumerable propertys) where T : new()
{
var list = new List();
//遍历DataTable中所有的数据行
foreach (DataRow dr in dt.Rows)
{
if (dr.RowState == DataRowState.Deleted) continue;
var entity = new T();
//遍历该对象的所有属性
foreach (PropertyInfo p in propertys)
{
//将属性名称赋值给临时变量
string tmpName = p.Name;
//检查DataTable是否包含此列(列名==对象的属性名)
if (!dt.Columns.Contains(tmpName)) continue;
//取值
object value = dr[tmpName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
{
p.SetValue(entity, value, null);
}
}
//对象添加到泛型集合中
list.Add(entity);
}
return list;
}
///
/// 对象转DataTable
///
///
///
public static DataTable ToDataTable(IList list)
{
return ToDataTable(list, false);
}
public static DataTable ToDataTable(IList list, bool blankOption)
{
Type elementType = typeof(T);
var t = new DataTable();
elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
if (blankOption)
{
var row = t.NewRow();
t.Rows.Add(row);
}
foreach (T item in list)
{
var row = t.NewRow();
elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
t.Rows.Add(row);
}
return t;
}
public static DataTable ToDataTable(T[] list)
{
Type elementType = typeof(T);
var t = new DataTable();
elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
foreach (T item in list)
{
var row = t.NewRow();
elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
t.Rows.Add(row);
}
return t;
}
}
}