您的位置:首页 > 其它

datatable转换为list<model> 映射

2016-08-26 09:44 357 查看
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;

namespace PORM.Data
{
/// <summary>
/// 常用映射关系帮助类
/// </summary>
public class CommonMap
{
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dReader"></param>
/// <returns></returns>
public static IEnumerable<T> MapToIEnumerable<T>(IDataReader dReader) where T : class
{
using (dReader)
{
List<string> drFields = new List<string>(dReader.FieldCount);
for (int i = 0; i < dReader.FieldCount; i++)
{
drFields.Add(dReader.GetName(i).ToLower());
}
while (dReader.Read())
{
T model = Activator.CreateInstance<T>();
foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
{
if (drFields.Contains(pi.Name.ToLower()))
{
if (pi.PropertyType.IsEnum)
{
object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
pi.SetValue(model, enumName, null);
}
else
{
if (!IsNullOrEmptyOrDBNull(dReader[pi.Name]))
{
pi.SetValue(model, MapNullableType(dReader[pi.Name], pi.PropertyType), null);
}
}
}
}
yield return model;
}
}

}

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="table"></param>
/// <returns></returns>
public static IEnumerable<T> MapToIEnumerable<T>(DataTable table) where T : class
{
foreach (DataRow row in table.Rows)
{
yield return MapToModel<T>(row);
}
}

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dReader"></param>
/// <returns></returns>
public static T MapToModel<T>(IDataReader dReader) where T : class
{
using (dReader)
{
if (dReader.Read())
{
List<string> drFields = new List<string>(dReader.FieldCount);
for (int i = 0; i < dReader.FieldCount; i++)
{
drFields.Add(dReader.GetName(i).ToLower());
}
T model = Activator.CreateInstance<T>();
foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
{
if (drFields.Contains(pi.Name.ToLower()))
{
if (pi.PropertyType.IsEnum)
{
object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
pi.SetValue(model, enumName, null);
}
else
{
if (!IsNullOrEmptyOrDBNull(dReader[pi.Name]))
{
pi.SetValue(model, MapNullableType(dReader[pi.Name], pi.PropertyType), null);
}
}
}
}
return model;
}
}
return default(T);
}

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dRow"></param>
/// <returns></returns>
public static T MapToModel<T>(DataRow dRow) where T : class
{
try
{
List<string> drItems = new List<string>(dRow.ItemArray.Length);
for (int i = 0; i < dRow.ItemArray.Length; i++)
{
drItems.Add(dRow.Table.Columns[i].ColumnName.ToLower());
}
T model = Activator.CreateInstance<T>();
foreach (PropertyInfo pi in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
{
if (drItems.Contains(pi.Name.ToLower()))
{
if (pi.PropertyType.IsEnum) //属性类型是否表示枚举
{
object enumName = Enum.ToObject(pi.PropertyType, pi.GetValue(model, null));
pi.SetValue(model, enumName, null); //获取枚举值,设置属性值
}
else
{
if (!IsNullOrEmptyOrDBNull(dRow[pi.Name]))
{
pi.SetValue(model, MapNullableType(dRow[pi.Name], pi.PropertyType), null);
}
}
}
}
return model;
}
catch (Exception ex)
{
throw ex;
}
}

/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="mType"></param>
/// <returns></returns>
public static object MapNullableType(object value, Type mType)
{
if (mType.IsGenericType && mType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (IsNullOrEmptyOrDBNull(value))
return null;
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(mType);
mType = nullableConverter.UnderlyingType;
}
if (mType == typeof(bool) || mType == typeof(Boolean))
{
if (value is string)
{
if (value.ToString() == "1")
return true;
else
return false;
}
}
if (mType.IsEnum) //属性类型是否表示枚举
{
int intvalue;
if (int.TryParse(value.ToString(), out intvalue))
return Enum.ToObject(mType, Convert.ToInt32(value));
else
return System.Enum.Parse(mType, value.ToString(), false);
}
return Convert.ChangeType(value, mType);
}

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T MapType<T>(object value)
{
Type type = typeof(T);
if (CommonMap.IsNullOrEmptyOrDBNull(value))
value = type.IsValueType ? Activator.CreateInstance(type) : null;
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
try
{
return (T)Convert.ChangeType(value, type.GetGenericArguments()[0]);
}
catch
{
value = null;
return (T)value;
}
}
if (type.IsEnum)
return (T)Enum.ToObject(type, value);
return (T)Convert.ChangeType(value, typeof(T));
}

/// <summary>
/// 判断null或DBNull或空字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsNullOrEmptyOrDBNull(object obj)
{
return ((obj is DBNull) || obj == null || string.IsNullOrEmpty(obj.ToString())) ? true : false;
}

}
}


   List<UnCompareDrug> t = CommonMap.MapToIEnumerable<UnCompareDrug>(dt).ToList();

datatable转换为list<model>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: