zoukankan      html  css  js  c++  java
  • C# DataTable 和List之间相互转换的方法

     

     一 List<T>/IEnumerable转换到DataTable/DataView

    方法一:

     

    /// <summary>

    /// Convert a List{T} to a DataTable.

    /// </summary>

    private DataTable ToDataTable<T>(List<T> items)

    {

        var tb = new DataTable(typeof (T).Name);

      

        PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

      

        foreach (PropertyInfo prop in props)

        {

            Type t = GetCoreType(prop.PropertyType);

            tb.Columns.Add(prop.Name, t);

        }

      

        foreach (T item in items)

        {

            var values = new object[props.Length];

      

            for (int i = 0; i < props.Length; i++)

            {

                values[i] = props[i].GetValue(item, null);

            }

      

            tb.Rows.Add(values);

        }

      

        return tb;

    }

      

    /// <summary>

    /// Determine of specified type is nullable

    /// </summary>

    public static bool IsNullable(Type t)

    {

        return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));

    }

      

    /// <summary>

    /// Return underlying type if type is Nullable otherwise return the type

    /// </summary>

    public static Type GetCoreType(Type t)

    {

        if (t != null && IsNullable(t))

        {

            if (!t.IsValueType)

            {

                return t;

            }

            else

            {

                return Nullable.GetUnderlyingType(t);

            }

        }

        else

        {

            return t;

        }

    }

     

    方法二:

     

    public static DataTable ToDataTable<T>(IEnumerable<T> collection)

     {

         var props = typeof(T).GetProperties();

         var dt = new DataTable();

         dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());

         if (collection.Count() > 0)

         {

             for (int i = 0; i < collection.Count(); i++)

             {

                 ArrayList tempList = new ArrayList();

                 foreach (PropertyInfo pi in props)

                 {

                     object obj = pi.GetValue(collection.ElementAt(i), null);

                     tempList.Add(obj);

                 }

                 object[] array = tempList.ToArray();

                 dt.LoadDataRow(array, true);

             }

         }

         return dt;

     }

     

     

    二、DataTable转换到List

     

    方法一:

    public static IList<T> ConvertTo<T>(DataTable table)  

    {  

       if (table == null)  

       {  

           return null;  

       }  

      

       List<DataRow> rows = new List<DataRow>();  

      

       foreach (DataRow row in table.Rows)  

       {  

           rows.Add(row);  

       }  

      

       return ConvertTo<T>(rows);  

    }  

      

    public static IList<T> ConvertTo<T>(IList<DataRow> rows)  

    {  

       IList<T> list = null;  

      

       if (rows != null)  

       {  

           list = new List<T>();  

      

           foreach (DataRow row in rows)  

           {  

               T item = CreateItem<T>(row);  

               list.Add(item);  

           }  

       }  

      

       return list;

    }    

      

    public static T CreateItem<T>(DataRow row)    

    {

        T obj = default(T);    

        if (row != null)    

        {    

           obj = Activator.CreateInstance<T>();    

      

           foreach (DataColumn column in row.Table.Columns)    

           {    

               PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);    

               try    

               {    

                   object value = row[column.ColumnName];    

                   prop.SetValue(obj, value, null);    

               }    

               catch    

               {  //You can log something here     

                   //throw;    

               }    

           }    

        }    

      

    return obj;    

    }

     

    方法二:

    using System;      

    using System.Collections.Generic;  

    using System.Text;    

    using System.Data;    

    using System.Reflection;  

    namespace NCL.Data    

    {    

        /// <summary>    

        /// 实体转换辅助类    

        /// </summary>    

        public class ModelConvertHelper<T> where   T : new()    

         {    

            public static IList<T> ConvertToModel(DataTable dt)    

             {    

                // 定义集合    

                 IList<T> ts = new List<T>(); 

          

                // 获得此模型的类型   

                 Type type = typeof(T);      

                string tempName = "";      

           

                foreach (DataRow dr in dt.Rows)      

                 {    

                     T t = new T();     

                    // 获得此模型的公共属性      

                     PropertyInfo[] propertys = t.GetType().GetProperties(); 

                    foreach (PropertyInfo pi in propertys)      

                     {      

                         tempName = pi.Name;  // 检查DataTable是否包含此列    

        

                        if (dt.Columns.Contains(tempName))      

                         {      

                            // 判断此属性是否有Setter      

                            if (!pi.CanWrite) continue;         

        

                            object value = dr[tempName];      

                            if (value != DBNull.Value)      

                                 pi.SetValue(t, value, null);  

                         }     

                     }      

                     ts.Add(t);      

                 }     

                return ts;     

             }     

         }    

    }

     

    使用方式:  

    // 获得查询结果  

    DataTable dt = DbHelper.ExecuteDataTable(...);  

    // 把DataTable转换为IList<UserInfo>  

    IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);

  • 相关阅读:
    按分类统计商品总数的性能优化思考
    Flash/Flex学习笔记(52):使用TweenLite
    Flash/Flex学习笔记(36):自己动手实现一个滑块控件(JimmySilder)
    解决JQuery中的ready函数冲突
    Flash/Flex学习笔记(41):碰撞检测
    Flash/Flex学习笔记(34):AS3中的自定义事件
    如何改变AspNetPager当前页码的默认红色?
    Flash/Flex学习笔记(42):坐标旋转
    Flash/Flex学习笔记(39):弹性运动
    C#检测SqlServer中某张表是否存在
  • 原文地址:https://www.cnblogs.com/lgx5/p/6890595.html
Copyright © 2011-2022 走看看