码迷,mamicode.com
首页 > 其他好文 > 详细

反射小应用之DataTable和List<T>互操作

时间:2014-05-25 20:15:28      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   java   

在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List<T>那么方便,而另外一些时候(比如使用SqlBulkCopy的时候)使用DataTable会比较方便。于是我们就会想写一个专门的它们之间的互操作来使我们在操作它们的时候变得不那么复杂。网上关于它们之间的互操作的解决方法蛮多。这里参考了下它们,结合自己实际应用,写了一个它们之间互操作的扩展类

bubuko.com,布布扣
public static class DataTableEntityInteroperate
{
    /// <summary>
    /// List<T> to DataTable
    /// </summary>
    /// <typeparam name="T">Entity</typeparam>
    /// <param name="entities">Entities</param>
    /// <returns>DataTable</returns>
    internal static DataTable ToDataTable<T>(this List<T> entities) where T : class,new()
    {
        //IsNull return
        if (null == entities || entities.Count == 0)
            return null;
        //Initial Columns
        DataTable dt = new DataTable();
        PropertyInfo[] pArray = typeof(T).GetProperties();
        Array.ForEach<PropertyInfo>(pArray, p =>
        {
            dt.Columns.Add(p.Name);
        });
        //Initial Rows
        DataRow dr = dt.NewRow();
        entities.ForEach(t =>
        {
            int i = 0;
            Array.ForEach<PropertyInfo>(pArray, p =>
            {
                if (dt.Columns.Contains(p.Name))
                    dr[i] = p.GetValue(t); //Assigned to each column
            });
            i++;
        });
        return dt;
    }

    /// <summary>
    /// DataTable to Entities
    /// </summary>
    /// <typeparam name="T">Entity</typeparam>
    /// <param name="dt">DataTable</param>
    /// <returns>List<T</returns>
    internal static List<T> ToEntities<T>(this DataTable dt)/*必须来在于数据库来自于文件可能存在问题*/ where T : class,new()
    {
        //IsNullable
        if (null == dt || dt.Rows.Count == 0)
            return null;
        //Initial Entities
        List<T> entities = new List<T>();
        foreach (DataRow row in dt.Rows)
        {
            PropertyInfo[] pArray = typeof(T).GetProperties();
            T entity = new T();
            Array.ForEach<PropertyInfo>(pArray, p =>
                {
                    p.SetValue(entity, row[p.Name], null);
                });
            entities.Add(entity);
        }
        return entities;
    }
}
bubuko.com,布布扣

关乎ToEntities扩展方法的备注:这个方法适合的是DataTable是由数据库直接返回的情况。如果DataTable数据是由Xml文件直接反序列化而来。就要在初始化DataTable时候,对DaTable的列对应在数据实体中的类型进行指定

 

反射小应用之DataTable和List<T>互操作,布布扣,bubuko.com

反射小应用之DataTable和List<T>互操作

标签:style   class   blog   c   code   java   

原文地址:http://www.cnblogs.com/fengchengjushi/p/3751402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!