using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Com.AppCode.Extend
{
static public class TableConvert
{
#region DataTable 1
/// <summary>
/// 将datatable转换为泛型集合
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="inputDataTable"></param>
/// <returns></returns>
public static List<TEntity> ToList<TEntity>(
this DataTable inputDataTable)
where TEntity :
class,
new()
{
if (inputDataTable ==
null)
{
throw new ArgumentNullException(
"input datatable is null");
}
Type type =
typeof(TEntity);
PropertyInfo[] propertyInfos =
type.GetProperties();
List<TEntity> lstEntitys =
new List<TEntity>
();
foreach (DataRow row
in inputDataTable.Rows)
{
object obj =
Activator.CreateInstance(type);
foreach (PropertyInfo pro
in propertyInfos)
{
foreach (DataColumn col
in inputDataTable.Columns)
{
//如果直接查询的数据库,数据库是不区别大小写的,所以转换为小写忽略大小写的问题
if (col.ColumnName.ToLower().Equals(pro.Name.ToLower()))
{
//属性是否是可写的,如果是只读的属性跳过。
if (pro.CanWrite)
{
//判断类型,基本类型,如果是其他的类属性
if (pro.PropertyType ==
typeof(System.Int32))
{
pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType ==
typeof(System.String))
{
pro.SetValue(obj, row[pro.Name.ToLower()].ToString());
}
else if (pro.PropertyType ==
typeof(System.Boolean))
{
pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType ==
typeof(System.DateTime))
{
pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType ==
typeof(System.Int64))
{
pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()]));
}
else
{
pro.SetValue(obj, row[pro.Name.ToLower()]);
}
}
}
}
}
TEntity tEntity = obj
as TEntity;
lstEntitys.Add(tEntity);
}
return lstEntitys;
}
/// <summary>
/// 将list转换为datatable
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="inputList"></param>
/// <returns></returns>
public static DataTable ToDataTable<TEntity>(
this List<TEntity> inputList)
where TEntity :
class,
new()
{
if (inputList ==
null)
{
throw new ArgumentNullException(
"inputList");
}
DataTable dt =
null;
Type type =
typeof(TEntity);
if (inputList.Count ==
0)
{
dt =
new DataTable(type.Name);
return dt;
}
else { dt =
new DataTable(); }
PropertyInfo[] propertyInfos =
type.GetProperties();
foreach (
var item
in propertyInfos)
{
dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType =
item.PropertyType });
}
foreach (
var item
in inputList)
{
DataRow row =
dt.NewRow();
foreach (
var pro
in propertyInfos)
{
row[pro.Name] =
pro.GetValue(item);
}
dt.Rows.Add(row);
}
return dt;
}
#endregion
#region DataTable 2
/// <summary>
/// DataTable转成List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ToDataList<T>(
this DataTable dt)
{
var list =
new List<T>
();
var plist =
new List<PropertyInfo>(
typeof(T).GetProperties());
foreach (DataRow item
in dt.Rows)
{
T s = Activator.CreateInstance<T>
();
for (
int i =
0; i < dt.Columns.Count; i++
)
{
PropertyInfo info = plist.Find(p => p.Name ==
dt.Columns[i].ColumnName);
if (info !=
null)
{
try
{
if (!
Convert.IsDBNull(item[i]))
{
object v =
null;
if (info.PropertyType.ToString().Contains(
"System.Nullable"))
{
v =
Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
}
else
{
v =
Convert.ChangeType(item[i], info.PropertyType);
}
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception(
"字段[" + info.Name +
"]转换出错," +
ex.Message);
}
}
}
list.Add(s);
}
return list;
}
/// <summary>
/// DataTable转成Dto
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static T ToDataDto<T>(
this DataTable dt)
{
T s = Activator.CreateInstance<T>
();
if (dt ==
null || dt.Rows.Count ==
0)
{
return s;
}
var plist =
new List<PropertyInfo>(
typeof(T).GetProperties());
for (
int i =
0; i < dt.Columns.Count; i++
)
{
PropertyInfo info = plist.Find(p => p.Name ==
dt.Columns[i].ColumnName);
if (info !=
null)
{
try
{
if (!Convert.IsDBNull(dt.Rows[
0][i]))
{
object v =
null;
if (info.PropertyType.ToString().Contains(
"System.Nullable"))
{
v = Convert.ChangeType(dt.Rows[
0][i], Nullable.GetUnderlyingType(info.PropertyType));
}
else
{
v = Convert.ChangeType(dt.Rows[
0][i], info.PropertyType);
}
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception(
"字段[" + info.Name +
"]转换出错," +
ex.Message);
}
}
}
return s;
}
/// <summary>
/// 将实体集合转换为DataTable
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="entities">实体集合</param>
public static DataTable ToTable<T>(List<T>
entities)
{
var result = CreateTable<T>
();
FillData(result, entities);
return result;
}
/// <summary>
/// 创建表
/// </summary>
private static DataTable CreateTable<T>
()
{
var result =
new DataTable();
var type =
typeof(T);
foreach (
var property
in type.GetProperties(System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance))
{
var propertyType =
property.PropertyType;
if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() ==
typeof(Nullable<>
)))
propertyType = propertyType.GetGenericArguments()[
0];
result.Columns.Add(property.Name, propertyType);
}
return result;
}
/// <summary>
/// 填充数据
/// </summary>
private static void FillData<T>(DataTable dt, IEnumerable<T>
entities)
{
foreach (
var entity
in entities)
{
dt.Rows.Add(CreateRow(dt, entity));
}
}
/// <summary>
/// 创建行
/// </summary>
private static DataRow CreateRow<T>
(DataTable dt, T entity)
{
DataRow row =
dt.NewRow();
var type =
typeof(T);
foreach (
var property
in type.GetProperties(System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance))
{
row[property.Name] = property.GetValue(entity) ??
DBNull.Value;
}
return row;
}
#endregion
#region DataTable 3
/// <summary>
/// DataTable转换为List
/// </summary>
/// <typeparam name="T">实体对象</typeparam>
/// <param name="dt">datatable表</param>
/// <returns>返回list集合</returns>
static public List<T> TableToList<T>(DataTable dt)
where T :
new()
{
//定义集合
List<T> list =
new List<T>
();
//获得此模型的类型
Type type =
typeof(T);
//定义一个临时变量
string tempName =
string.Empty;
//遍历Datatable中所有的数据行
foreach (DataRow dr
in dt.Rows)
{
T t =
new T();
//获得此模型的公共属性
PropertyInfo[] propertys =
t.GetType().GetProperties();
//遍历该对象的所有属性
foreach (PropertyInfo pi
in propertys)
{
//将属性名称赋值给临时变量
tempName =
pi.Name;
//检查DataTable是否包含此列(列名==对象的属性名)
if (dt.Columns.Contains(tempName))
{
//判断此属性是否有Setter
if (!pi.CanWrite)
continue;
//该属性不可写,直接跳出
//取值
object value =
dr[tempName];
//如果非空,则赋给对象的属性
if (value !=
DBNull.Value)
{
//加一重if判断,如果属性值是int32类型的,就进行一次强制转换
if (pi.GetMethod.ReturnParameter.ParameterType.Name ==
"Int32")
{
value =
Convert.ToInt32(value);
}
pi.SetValue(t, value, null);
}
}
}
//对象添加到泛型集合中
list.Add(t);
}
return list;
}
#endregion
}
}