DataReader轉實體類的方法


都在注釋里了,不多說了

         ///   <summary>
        
///  DataReader轉泛型
        
///   </summary>
        
///   <typeparam name="T"> 傳入的實體類 </typeparam>
        
///   <param name="objReader"> DataReader對象 </param>
        
///   <returns></returns>
         public  static IList<T> ReaderToList<T>( this IDataReader objReader)
        {
             using (objReader)
            {
                List<T> list =  new List<T>();

                 // 獲取傳入的數據類型
                Type modelType =  typeof(T);

                 // 遍歷DataReader對象
                 while (objReader.Read())
                {
                     // 使用與指定參數匹配最高的構造函數,來創建指定類型的實例
                    T model = Activator.CreateInstance<T>();
                     for ( int i =  0; i < objReader.FieldCount; i++)
                    {
                         // 判斷字段值是否為空或不存在的值
                         if (!IsNullOrDBNull(objReader[i]))
                        {
                             // 匹配字段名
                            PropertyInfo pi = modelType.GetProperty(objReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                             if (pi !=  null)
                            {
                                 // 綁定實體對象中同名的字段  
                                pi.SetValue(model, CheckType(objReader[i], pi.PropertyType),  null);
                            }
                        }
                    }
                    list.Add(model);
                }
                 return list;
            }
        }

         ///   <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);
        }

         ///   <summary>
        
///  判斷指定對象是否是有效值
        
///   </summary>
        
///   <param name="obj"></param>
        
///   <returns></returns>
         private  static  bool IsNullOrDBNull( object obj)
        {
             return (obj ==  null || (obj  is DBNull)) ?  true :  false;
        }


///   <summary>
        
///  DataReader轉模型
        
///   </summary>
        
///   <typeparam name="T"></typeparam>
        
///   <param name="objReader"></param>
        
///   <returns></returns>
         public  static T ReaderToModel<T>( this IDataReader objReader)
        {

             using (objReader)
            {
                 if (objReader.Read())
                {
                    Type modelType =  typeof(T);
                     int count = objReader.FieldCount;
                    T model = Activator.CreateInstance<T>();
                     for ( int i =  0; i < count; i++)
                    {
                         if (!IsNullOrDBNull(objReader[i]))
                        {
                            PropertyInfo pi = modelType.GetProperty(objReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                             if (pi !=  null)
                            {
                                pi.SetValue(model, CheckType(objReader[i], pi.PropertyType),  null);
                            }
                        }
                    }
                     return model;
                }
            }
             return  default(T);
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM