You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Reflection;
namespace DS.Module.FastReport
{
/// <summary>
/// 实体转换辅助类
/// </summary>
public static class ModelConvertHelper
{
/// <summary>
/// 转为List<T>
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ToModelList<T>(this DataTable dt) where T : new()
{
// 定义集合
List<T> ts = new List<T>();
// 获得此模型的类型
Type type = typeof(T);
string tempName = null, tempDescription = null;
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
// 检查DataTable是否包含此列
tempName = pi.Name;
tempDescription = pi == null
? null
: ((DescriptionAttribute)Attribute.GetCustomAttribute(pi, typeof(DescriptionAttribute)))
?.Description;
string column = tempDescription ?? tempName;
if (dt.Columns.Contains(column))
{
// 判断此属性是否有Setter
if (!pi.CanWrite)
continue;
object value = dr[column];
if (value != DBNull.Value)
{
if (pi.PropertyType.ToString().Contains("System.Nullable"))
value = Convert.ChangeType(value, Nullable.GetUnderlyingType(pi.PropertyType));
else
value = Convert.ChangeType(value, pi.PropertyType);
pi.SetValue(t, value, null);
}
}
}
ts.Add(t);
}
return ts;
}
/// <summary>
/// 将实体集合转换为DataTable
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="entities">实体集合</param>
public static DataTable ToDataTable<T>(this IList<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;
}
/// <summary>
/// 转换为List<T>, 仅转一 列
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <param name="column"></param>
/// <returns></returns>
public static List<T> ToSimpleList<T>(this DataTable dt, int column = 0)
{
// 定义集合
List<T> ts = new List<T>();
foreach (DataRow dr in dt.Rows)
{
T t = (T)dr[column];
ts.Add(t);
}
return ts;
}
}
}