/// <summary> /// 从reader读取数据并映射到类型type的类这里要求Type必须有一个默认的无参构造函数并且返回指定类型的集合 /// </summary> /// <param name="type">要映射的类型</param> /// <param name="convertType">要转换到的类型</param> /// <param name="reader">IdataReader</param> /// <returns>IEnumerable</returns> public static IEnumerable ToEnumerable(Type type, Type convertType, IDataReader reader) { var list = System.Activator.CreateInstance(typeof(List <>).MakeGenericType(convertType)) as IList; var binding = ModelBindingHelper.GetBinding(type, reader, string.Empty); using (reader) { while (reader.Read()) { var obj = ActivatorHelper.CreateInstance(type); var o = binding.Bind(obj); if (Cac.ContainsKey(type.FullName + convertType.FullName)) { var co = Cac[type.FullName + convertType.FullName]; list.Add(co(obj)); } else { var paramobj = Expression.Parameter(typeof(object), "obj"); var covert = Expression.Convert(paramobj, convertType); var lambda = Expression.Lambda <Func <object, object> >(covert, paramobj); var co = lambda.Compile(); Cac.Add(type.FullName + convertType.FullName, co); list.Add(co(obj)); } } } return(list); }
public static object ToModel(Type type, IDataReader reader, string prefix = "") { using (reader) { if (reader.Read()) { var obj = ActivatorHelper.CreateInstance(type); return(BindModel(obj, reader, prefix)); } } return(null); }
/// <summary> /// 从reader读取数据并映射到类型type的类这里要求Type必须有一个默认的无参构造函数 /// 也可以是Type可是是如List(Student) 这种类型 但是Student类型必须是有无参构造函数的类 /// </summary> /// <param name="type">要映射的类型System.Type</param> /// <param name="reader">IDataReader</param> /// <param name="prefix"></param> /// <returns>IEnumerable</returns> public static IEnumerable ToEnumerable(Type type, IDataReader reader, string prefix = "") { IList list = null; Type modelType = null; bool isArry = false; //直接接收泛型类型 if (type.IsGenericType && typeof(IList).IsAssignableFrom(type)) { list = ActivatorHelper.CreateInstance(type) as IList; modelType = type.GetGenericArguments()[0]; } else if (typeof(Array).IsAssignableFrom(type)) { isArry = true; modelType = type.GetElementType(); } else { list = ActivatorHelper.CreateInstance(typeof(List <>).MakeGenericType(type)) as IList; modelType = type; } var binding = ModelBindingHelper.GetBinding(modelType, reader, string.Empty); binding.Prefix = prefix; using (reader) { while (reader.Read()) { var obj = ActivatorHelper.CreateInstance(modelType); var o = binding.Bind(obj); list.Add(o); } } return(list); }