通过.net反射技术实现DataReader转换成Model实体类列表
public static T ReaderToModel<T>(IDataReader dr) { try { using (dr) { if (dr.Read()) { Type modelType = typeof(T); T model = Activator.CreateInstance<T>(); for (int i = 0; i < dr.FieldCount; i++) { PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i))); pi.SetValue(model, HackType(dr[i], pi.PropertyType), null); } return model; } } return default(T); } catch (Exception ex) { throw ex; } } public static List<T> ReaderToList<T>(IDataReader dr) { using (dr) { List<T> list = new List<T>(); Type modelType = typeof(T); while (dr.Read()) { T model = Activator.CreateInstance<T>(); for (int i = 0; i < dr.FieldCount; i++) { PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i))); pi.SetValue(model, HackType(dr[i], pi.PropertyType), null); } list.Add(model); } return list; } } //这个类对可空类型进行判断转换,要不然会报错 private static object HackType(object value, Type conversionType) { if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { if (value == null) return null; System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType); conversionType = nullableConverter.UnderlyingType; } return Convert.ChangeType(value, conversionType); } private static bool IsNullOrDBNull(object obj) { return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false; } //取得DB的列对应bean的属性名 private static string GetPropertyName(string column) { column = column.ToLower(); string[] narr = column.Split('_'); column =""; for (int i = 0; i < narr.Length; i++) { if (narr[i].Length > 1) { column += narr[i].Substring(0, 1).ToUpper() + narr[i].Substring(1); } else { column += narr[i].Substring(0, 1).ToUpper(); } } return column; }
posted on 2016-04-23 21:59 lijinchang 阅读(520) 评论(0) 编辑 收藏 举报