都在注釋里了,不多說了
///
<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);
}
/// 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);
}