128 lines
3.4 KiB
C#
128 lines
3.4 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Reflection;
|
||
|
||
namespace HT.Cloud.Code
|
||
{
|
||
public static class DataTableHelper
|
||
{
|
||
public static DataTable ListToDataTable<T>(List<T> entitys)
|
||
{
|
||
//检查实体集合不能为空
|
||
if (entitys == null || entitys.Count < 1)
|
||
{
|
||
throw new Exception("需转换的集合为空");
|
||
}
|
||
//取出第一个实体的所有Propertie
|
||
Type entityType = entitys[0].GetType();
|
||
PropertyInfo[] entityProperties = entityType.GetProperties();
|
||
|
||
//生成DataTable的structure
|
||
//生产代码中,应将生成的DataTable结构Cache起来,此处略
|
||
DataTable dt = new DataTable();
|
||
for (int i = 0; i < entityProperties.Length; i++)
|
||
{
|
||
dt.Columns.Add(entityProperties[i].Name);
|
||
}
|
||
//将所有entity添加到DataTable中
|
||
foreach (object entity in entitys)
|
||
{
|
||
//检查所有的的实体都为同一类型
|
||
if (entity.GetType() != entityType)
|
||
{
|
||
throw new Exception("要转换的集合元素类型不一致");
|
||
}
|
||
object[] entityValues = new object[entityProperties.Length];
|
||
for (int i = 0; i < entityProperties.Length; i++)
|
||
{
|
||
entityValues[i] = entityProperties[i].GetValue(entity, null);
|
||
}
|
||
dt.Rows.Add(entityValues);
|
||
}
|
||
return dt;
|
||
}
|
||
|
||
/// <summary>
|
||
/// List过滤
|
||
/// </summary>
|
||
/// <typeparam name="T"></typeparam>
|
||
/// <param name="entitys"></param>
|
||
/// <param name="list"></param>
|
||
/// <returns></returns>
|
||
public static List<T> ListFilter<T>(List<T> entitys, List<string> list)
|
||
{
|
||
//检查实体集合不能为空
|
||
if (entitys == null || entitys.Count < 1)
|
||
{
|
||
throw new Exception("需转换的集合为空");
|
||
}
|
||
//取出第一个实体的所有Propertie
|
||
Type entityType = entitys[0].GetType();
|
||
PropertyInfo[] entityProperties = entityType.GetProperties();
|
||
|
||
//将所有entity过滤
|
||
foreach (object entity in entitys)
|
||
{
|
||
//检查所有的的实体都为同一类型
|
||
if (entity.GetType() != entityType)
|
||
{
|
||
throw new Exception("要转换的集合元素类型不一致");
|
||
}
|
||
for (int i = 0; i < entityProperties.Length; i++)
|
||
{
|
||
if (!list.Contains(entityProperties[i].Name))
|
||
{
|
||
entityProperties[i].SetValue(entity, null);
|
||
}
|
||
}
|
||
}
|
||
return entitys;
|
||
}
|
||
|
||
/// <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;
|
||
}
|
||
}
|
||
} |