c# datatable 数据类型 转 泛型

来源:互联网 发布:直播刷人气软件 编辑:程序博客网 时间:2024/05/01 20:45

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;

namespace kang.Code.Extensions
{
public static class DataExtensions
{
/// <summary>
/// DataRow扩展方法:将DataRow类型转化为指定类型的实体
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <returns></returns>
public static T ToModel<T>(this DataRow dr) where T : class, new()
{
return ToModel<T>(dr, true);
}
/// <summary>
/// DataRow扩展方法:将DataRow类型转化为指定类型的实体
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param>
/// <returns></returns>
/// <summary>
public static T ToModel<T>(this DataRow dr, bool dateTimeToString) where T : class, new()
{
if (dr != null)
return ToList<T>(dr.Table, dateTimeToString).First();

return null;
}

/// <summary>
/// DataTable扩展方法:将DataTable类型转化为指定类型的实体集合
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt) where T : class, new()
{
return ToList<T>(dt, true);
}

/// <summary>
/// DataTable扩展方法:将DataTable类型转化为指定类型的实体集合
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="dateTimeToString">是否需要将日期转换为字符串,默认为转换,值为true</param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt, bool dateTimeToString) where T : class, new()
{
List<T> list = new List<T>();

if (dt != null)
{
List<PropertyInfo> infos = new List<PropertyInfo>();

Array.ForEach<PropertyInfo>(typeof(T).GetProperties(), p =>
{
if (dt.Columns.Contains(p.Name) == true)
{
infos.Add(p);
}
});

SetList<T>(list, infos, dt, dateTimeToString);
}

return list;
}

#region 私有方法

private static void SetList<T>(List<T> list, List<PropertyInfo> infos, DataTable dt, bool dateTimeToString) where T : class, new()
{
foreach (DataRow dr in dt.Rows)
{
T model = new T();

infos.ForEach(p =>
{
if (dr[p.Name] != DBNull.Value)
{
object tempValue = dr[p.Name];
if (dr[p.Name].GetType() == typeof(DateTime) && dateTimeToString == true)
{
tempValue = dr[p.Name].ToString();
}
try
{
p.SetValue(model, tempValue, null);
}
catch { }
}
});
list.Add(model);
}
}

#endregion
}
}

原创粉丝点击