using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Reflection;
|
|
namespace Common
|
{
|
public class ModelConvertHelper<T> where T : new()
|
{
|
public static IList<T> DataTableToModel(DataTable dt)
|
{
|
// 定义集合
|
IList<T> ts = new List<T>();
|
|
// 获得此模型的类型
|
Type type = typeof(T);
|
string tempName = "";
|
|
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)
|
pi.SetValue(t, value, null);
|
}
|
}
|
ts.Add(t);
|
}
|
return ts;
|
}
|
|
public static IList<T> DataRowToModel(DataRow[] rows)
|
{
|
// 定义集合
|
IList<T> ts = new List<T>();
|
|
// 获得此模型的类型
|
Type type = typeof(T);
|
string tempName = "";
|
|
foreach (DataRow dr in rows)
|
{
|
T t = new T();
|
// 获得此模型的公共属性
|
PropertyInfo[] propertys = t.GetType().GetProperties();
|
foreach (PropertyInfo pi in propertys)
|
{
|
tempName = pi.Name; // 检查DataTable是否包含此列
|
|
if (rows[0].Table.Columns.Contains(tempName))
|
{
|
// 判断此属性是否有Setter
|
if (!pi.CanWrite) continue;
|
|
object value = dr[tempName];
|
if (value != DBNull.Value)
|
pi.SetValue(t, value, null);
|
}
|
}
|
ts.Add(t);
|
}
|
return ts;
|
}
|
|
public static IList<T> DataSetToModel(DataSet ds, int tableIndex)
|
{
|
if (ds == null || ds.Tables.Count <= 0 || tableIndex < 0)
|
return null;
|
DataTable dt = ds.Tables[tableIndex];
|
return DataTableToModel(dt);
|
}
|
|
public static IList<T> DataReaderToModel(IDataReader dr)
|
{
|
List<T> result;
|
try
|
{
|
List<string> field = new List<string>(dr.FieldCount);
|
for (int i = 0; i < dr.FieldCount; i++)
|
{
|
field.Add(dr.GetName(i).ToLower());
|
}
|
List<T> list = new List<T>();
|
while (dr.Read())
|
{
|
T model = Activator.CreateInstance<T>();
|
PropertyInfo[] properties = model.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
|
for (int j = 0; j < properties.Length; j++)
|
{
|
PropertyInfo property = properties[j];
|
if (field.Contains(property.Name.ToLower()))
|
{
|
if (!IsNullOrDBNull(dr[property.Name]))
|
{
|
property.SetValue(model, HackType(dr[property.Name], property.PropertyType), null);
|
}
|
}
|
}
|
list.Add(model);
|
}
|
result = list;
|
}
|
finally
|
{
|
if (dr != null)
|
{
|
dr.Dispose();
|
}
|
}
|
return result;
|
}
|
|
public static T ReaderToModel(IDataReader dr)
|
{
|
T result;
|
try
|
{
|
try
|
{
|
if (dr.Read())
|
{
|
List<string> list = new List<string>(dr.FieldCount);
|
for (int i = 0; i < dr.FieldCount; i++)
|
{
|
list.Add(dr.GetName(i).ToLower());
|
}
|
T model = Activator.CreateInstance<T>();
|
PropertyInfo[] properties = model.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
|
for (int j = 0; j < properties.Length; j++)
|
{
|
PropertyInfo pi = properties[j];
|
if (list.Contains(pi.Name.ToLower()))
|
{
|
if (!IsNullOrDBNull(dr[pi.Name]))
|
{
|
pi.SetValue(model, HackType(dr[pi.Name], pi.PropertyType), null);
|
}
|
}
|
}
|
result = model;
|
return result;
|
}
|
}
|
finally
|
{
|
if (dr != null)
|
{
|
dr.Dispose();
|
}
|
}
|
result = default(T);
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
return result;
|
}
|
|
private static object HackType(object value, Type conversionType)
|
{
|
object result;
|
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
|
{
|
if (value == null)
|
{
|
result = null;
|
return result;
|
}
|
NullableConverter nullableConverter = new NullableConverter(conversionType);
|
conversionType = nullableConverter.UnderlyingType;
|
}
|
result = Convert.ChangeType(value, conversionType);
|
return result;
|
}
|
private static bool IsNullOrDBNull(object obj)
|
{
|
return obj is DBNull || string.IsNullOrEmpty(obj.ToString());
|
}
|
}
|
}
|