list<T>与datatable互相转换

public static class DataTableExtensions
{
    /// <summary>    

    /// 转化一个DataTable    

    /// </summary>    

    /// <typeparam name="T"></typeparam>
    /// <param name="list"></param>
    /// <returns></returns>
    public static DataTable ToDataTable<T>(this IEnumerable<T> list)
    {  

        //创建属性的集合
        List<PropertyInfo> pList = new List<PropertyInfo>();
        //获得反射的入口    

        Type type = typeof(T);
        DataTable dt = new DataTable();
        //把所有的public属性加入到集合 并添加DataTable的列
        Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
        foreach (var item in list)
        {
            //创建一个DataRow实例
            DataRow row = dt.NewRow();
            //给row 赋值
            pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
            //加入到DataTable
            dt.Rows.Add(row);
        }
        return dt;
    }  

    /// <summary>
    /// DataTable 转换为List 集合
    /// </summary>
    /// <typeparam name="TResult">类型</typeparam>
    /// <param name="dt">DataTable</param>
    /// <returns></returns>
    public static List<T> ToList<T>(this DataTable dt) where T : class, new()
    {
        //创建一个属性的列表
        List<PropertyInfo> prlist = new List<PropertyInfo>();
        //获取TResult的类型实例  反射的入口    

        Type t = typeof(T);  

        //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
        Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });  

        //创建返回的集合    

        List<T> oblist = new List<T>();  

        foreach (DataRow row in dt.Rows)
        {
            //创建TResult的实例
            T ob = new T();
            //找到对应的数据  并赋值
            prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
            //放入到返回的集合中.
            oblist.Add(ob);
        }
        return oblist;
    }  

    /// <summary>
    /// 将集合类转换成DataTable
    /// </summary>
    /// <param name="list">集合</param>
    /// <returns></returns>
    public static DataTable ToDataTableTow(IList list)
    {
        DataTable result = new DataTable();
        if (list.Count > 0)
        {
            PropertyInfo[] propertys = list[0].GetType().GetProperties();  

            foreach (PropertyInfo pi in propertys)
            {
                result.Columns.Add(pi.Name, pi.PropertyType);
            }
            for (int i = 0; i < list.Count; i++)
            {
                ArrayList tempList = new ArrayList();
                foreach (PropertyInfo pi in propertys)
                {
                    object obj = pi.GetValue(list[i], null);
                    tempList.Add(obj);
                }
                object[] array = tempList.ToArray();
                result.LoadDataRow(array, true);
            }
        }
        return result;
    }  

    /**/  

    /// <summary>
    /// 将泛型集合类转换成DataTable    

    /// </summary>
    /// <typeparam name="T">集合项类型</typeparam>    

    /// <param name="list">集合</param>
    /// <returns>数据集(表)</returns>
    public static DataTable ToDataTable<T>(IList<T> list)
    {
        return ToDataTable<T>(list, null);  

    }  

    /**/  

    /// <summary>
    /// 将泛型集合类转换成DataTable
    /// </summary>
    /// <typeparam name="T">集合项类型</typeparam>
    /// <param name="list">集合</param>
    /// <param name="propertyName">需要返回的列的列名</param>
    /// <returns>数据集(表)</returns>
    public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
    {
        List<string> propertyNameList = new List<string>();
        if (propertyName != null)
            propertyNameList.AddRange(propertyName);
        DataTable result = new DataTable();
        if (list.Count > 0)
        {
            PropertyInfo[] propertys = list[0].GetType().GetProperties();
            foreach (PropertyInfo pi in propertys)
            {
                if (propertyNameList.Count == 0)
                {
                    result.Columns.Add(pi.Name, pi.PropertyType);
                }
                else
                {
                    if (propertyNameList.Contains(pi.Name))
                        result.Columns.Add(pi.Name, pi.PropertyType);
                }
            }  

            for (int i = 0; i < list.Count; i++)
            {
                ArrayList tempList = new ArrayList();
                foreach (PropertyInfo pi in propertys)
                {
                    if (propertyNameList.Count == 0)
                    {
                        object obj = pi.GetValue(list[i], null);
                        tempList.Add(obj);
                    }
                    else
                    {
                        if (propertyNameList.Contains(pi.Name))
                        {
                            object obj = pi.GetValue(list[i], null);
                            tempList.Add(obj);
                        }
                    }
                }
                object[] array = tempList.ToArray();
                result.LoadDataRow(array, true);
            }
        }
        return result;
    }
}

  

时间: 2024-10-22 07:24:37

list<T>与datatable互相转换的相关文章

C# 将DataTable数据源转换成实体类

1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Reflection; 5 6 /// <summary> 7 /// 将DataTable数据源转换成实体类 8 /// </summary> 9 /// <typeparam name="T">实体</typeparam> 10 public static cl

XML 与 DataSet/DataTable 互相转换实例(C#)——转载

// <summary>      /// XML形式的字符串.XML文江转换成DataSet.DataTable格式      /// </summary>      public class XmlToData      {          /**//// <summary>          /// 将Xml内容字符串转换成DataSet对象          /// </summary>          /// <param name=&q

实体类和DataTable的转换

引子 最近在项目中在数据库查询的时间,总是要用到数据表到实体类对象列表的转化,自己封装了一个转换的方法,用起来还比较方便,记下来,以后可以重复使用,原理就主要是利用反射,当然有更好的ORM框架可以实现,主要的原因就是我这里没有用orm. 实现 话不多少,直接上实现代码 /// <summary> /// 数据表转换类 /// </summary> /// <typeparam name="T"></typeparam> public cl

datatable 行列转换

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { DataTable dt = GetDt(); DataTable

dataTable/dataSet转换成Json格式

using System.Text;using System.Collections.Generic; public static string DataTable2Json(DataTable dt) { StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("{\""); jsonBuilder.Append(dt.TableName.ToString()); jsonBuilder.App

DataTable,DataGridVIew转换到xls 方法 (转)

private void dataTableToCsv(DataTable table, string file) { string title = ""; FileStream fs = new FileStream(file, FileMode.OpenOrCreate); //FileStream fs1 = File.Open(file, FileMode.Open, FileAccess.Read); StreamWriter sw = new StreamWriter(ne

DataTable 无法转换的错误

目前基本上检索都已经离不开Linq了.所以最近在Linq的过程中出现了一些意外情况,特此记录下来. 先描述一下场景: 有一个查询的要求是这样的,检索出Status > 1 的数据.因为要根据其他状态也要处理,所以一次全部查询出来,再分别处理: var tableEnumberable = Ds.Table[0].AsEnumerable(); tableEnumberable.Where(o=>o.Field<Int32>("Status") > 1) 这

DataTable 基本转换简单实例

var query = from dt in tblProduct.AsEnumerable() where dt.Field<string>("StockNo") =="" select dt; if (query.ToList().Count > 0) { Alert.ShowInTop("数据不全,仓库不能为空"); return; }

C# 实现DataTable、DataSet与XML互相转换

/**//// <summary> /// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件 /// </summary> public class DataToXml { /**//// <summary> /// 将DataTable对象转换成XML字符串 /// </summary> /// <param name="dt">DataTable对象</param> //