using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Reflection; namespace Common { public class ModelConvertHelper where T : new() { public static IList DataTableToModel(DataTable dt) { // 定义集合 IList ts = new List(); // 获得此模型的类型 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 DataRowToModel(DataRow[] rows) { // 定义集合 IList ts = new List(); // 获得此模型的类型 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 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 DataReaderToModel(IDataReader dr) { List result; try { List field = new List(dr.FieldCount); for (int i = 0; i < dr.FieldCount; i++) { field.Add(dr.GetName(i).ToLower()); } List list = new List(); while (dr.Read()) { T model = Activator.CreateInstance(); 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 list = new List(dr.FieldCount); for (int i = 0; i < dr.FieldCount; i++) { list.Add(dr.GetName(i).ToLower()); } T model = Activator.CreateInstance(); 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()); } } }