zoukankan      html  css  js  c++  java
  • 使用泛型和反射实现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

  • 相关阅读:
    OpenCv 人脸识别 基础
    C++ 0x std::async 的应用
    C++ 0x 使用condition_variable 与 Mutex 同步两个线程
    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数
    C++ 11 中的 Lambda 表达式的使用
    DirectShow 制作在Unity3D中可以设置进度的视频播放插件
    Async/Await 如何通过同步的方式实现异步
    React Native 开源项目汇总
    ES6 Promise的理解与简单实现(链接)
    深刻理解BFC(链接)
  • 原文地址:https://www.cnblogs.com/highest/p/8461175.html
Copyright © 2011-2022 走看看