using System;
using System.Collections.Generic;
using System.Data;
using System.Dynamic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace BPA.SAAS.Manage.Comm.Util
{
public static class DataTableUitity
{
///
/// 将DataTable 转换成 List
/// reverse 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除.
/// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]
/// FilterField 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数
///
/// DataTable
///
/// 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除.
/// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]
///
/// 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数据
/// List
public static List ToDynamicList(this DataTable table, bool reverse = true, params string[] FilterField)
{
var modelList = new List();
foreach (DataRow row in table.Rows)
{
dynamic model = new ExpandoObject();
var dict = (IDictionary)model;
foreach (DataColumn column in table.Columns)
{
if (FilterField.Length != 0)
{
if (reverse == true)
{
if (!FilterField.Contains(column.ColumnName))
{
dict[column.ColumnName] = row[column];
}
}
else
{
if (FilterField.Contains(column.ColumnName))
{
dict[column.ColumnName] = row[column];
}
}
}
else
{
dict[column.ColumnName] = row[column];
}
}
modelList.Add(model);
}
return modelList;
}
public static List DatatTableToList(DataTable dt) where T : class, new()
{
List list = new List();
T t = new T();
PropertyInfo[] prop = t.GetType().GetProperties();
//遍历所有DataTable的行
foreach (DataRow dr in dt.Rows)
{
t = new T();
//通过反射获取T类型的所有成员
foreach (PropertyInfo pi in prop)
{
//DataTable列名=属性名
if (dt.Columns.Contains(pi.Name))
{
//属性值不为空
if (dr[pi.Name] != DBNull.Value)
{
object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType);
//给T类型字段赋值
pi.SetValue(t, value, null);
}
}
}
//将T类型添加到集合list
list.Add(t);
}
return list;
}
public static T ConvertToEntity(DataTable dt) where T : new()
{
//定义一个变量,用来接收属性名
string tempType = string.Empty;
T t = new T();
//获得T的所有属性
PropertyInfo[] propertyInfos = t.GetType().GetProperties();
foreach (DataRow dr in dt.Rows)
{
foreach (PropertyInfo pi in propertyInfos)
{
//将属性名赋值给临时变量
tempType = pi.Name;
//如果表的列名不包含此属性,则跳过检查下一条属性
if (!dt.Columns.Contains(tempType)) continue;
//如果此属性可写
if (pi.CanWrite)
{
object value = dr[tempType];
//如果表中的字段值不为空,则赋值
if (value != DBNull.Value)
{
value = Convert.ChangeType(value, pi.PropertyType);
pi.SetValue(t, value, null);
}
}
}
}
return t;
}
///
/// List转换为DataTable
///
/// List中的类型
/// 要转换的list
///
public static DataTable ListToDataTable(List list) where T : class
{
DataTable dt = new DataTable();
PropertyInfo[] prop = typeof(T).GetProperties();
DataColumn[] ColumnArr = prop.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray();
dt.Columns.AddRange(ColumnArr);
foreach (T t in list)
{
DataRow dr = dt.NewRow();
foreach (PropertyInfo pi in prop)
{
if (dt.Columns.Contains(pi.Name))
{
if (pi.GetValue(t) != null)
{
dr[pi.Name] = pi.GetValue(t);
}
}
}
dt.Rows.Add(dr);
}
return dt;
}
}
}