使用泛型和反射实现IDataReader转实体

    #region 使用反射和泛型实现IDataReader向实体的转化(扩展方法)
    /// <summary>
    /// 使用反射和泛型实现IDataReader向实体的转化(扩展方法)
    /// </summary>
    public static class ReaderHelper
    {
        #region IDataReader 转实体
        /// <summary>
        /// IDataReader 转实体
        /// </summary>
        /// <typeparam name="T">传入的实体类</typeparam>
        /// <param name="row">数据库返回IDataReader</param>
        /// <returns></returns>
        public static T ReaderToModel<T>(this IDataReader row)
        {
            try
            {
                // 1、使用与指定参数匹配最高的构造函数,来创建指定类型的实例
                Type modelType = typeof(T);
                T model = Activator.CreateInstance<T>();
                for (int i = 0; i < row.FieldCount; i++)
                {
                    // 2、判断字段值是否为空或不存在的值
                    if (!(row[i] == null || row[i] is DBNull))
                    {
                        // 3、匹配字段名
                        PropertyInfo pi = modelType.GetProperty(row.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                        if (pi != null)
                        {
                            // 4、绑定实体对象中同名的字段 
                            pi.SetValue(model, CheckType(row[i], pi.PropertyType), null);
                        }
                    }
                }

                return model;
            }
            catch (Exception)
            {
                throw;
            }
        }
        #endregion

        #region IDataReader 转实体列表
        /// <summary>
        /// DataReader转泛型
        /// </summary>
        /// <typeparam name="T">传入的实体类</typeparam>
        /// <param name="objReader">DataReader对象</param>
        /// <returns></returns>
        public static List<T> ReaderToList<T>(this IDataReader objReader)
        {
            try
            {
                using (objReader)
                {
                    List<T> list = new List<T>();

                    //1、获取传入的数据类型
                    Type modelType = typeof(T);

                    //2、遍历DataReader对象
                    while (objReader.Read())
                    {
                        // 3、使用与指定参数匹配最高的构造函数,来创建指定类型的实例
                        T model = Activator.CreateInstance<T>();
                        for (int i = 0; i < objReader.FieldCount; i++)
                        {
                            // 4、判断字段值是否为空或不存在的值
                            if (!(objReader[i] == null || objReader[i] is DBNull))
                            {
                                // 5、匹配字段名
                                PropertyInfo pi = modelType.GetProperty(objReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                                if (pi != null)
                                {
                                    // 6、绑定实体对象中同名的字段  
                                    pi.SetValue(model, CheckType(objReader[i], pi.PropertyType), null);
                                }
                            }
                        }
                        list.Add(model);
                    }
                    return list;
                }
            }
            catch
            {
                throw;
            }
        }
        #endregion

        #region 对可空类型进行判断
        /// <summary>
        /// 对可空类型进行判断转换(*要不然会报错)
        /// </summary>
        /// <param name="value">DataReader字段的值</param>
        /// <param name="conversionType">该字段的类型</param>
        /// <returns></returns>
        private static object CheckType(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);
        }
        #endregion

    }
    #endregion

借鉴自:https://www.cnblogs.com/zhuiyi/archive/2012/09/19/2694438.html

posted @ 2018-02-23 10:56  思明  阅读(384)  评论(0编辑  收藏  举报