zoukankan      html  css  js  c++  java
  • c# datatable list 相互转换

    /*Converts List To DataTable*/ 
            public static DataTable ToDataTable<TSource>(IList<TSource> data)
            {
                DataTable dataTable = new DataTable(typeof (TSource).Name);
                PropertyInfo[] props = typeof (TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
                foreach (PropertyInfo prop in props)
                {
                    dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ??
                                                     prop.PropertyType);
                }
                foreach (TSource item in data)
                {
                    var values = new object[props.Length];
                    for (int i = 0; i < props.Length; i++)
                    {
                        values[i] = props[i].GetValue(item, null);
                    }
                    dataTable.Rows.Add(values);
                }
                return dataTable;
            }
    
            /*Converts DataTable To List*/ 
            public static List<TSource> ToList<TSource>(DataTable dataTable) where TSource : new()
            {
                var dataList = new List<TSource>(); 
                const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
                var objFieldNames = (from PropertyInfo aProp in typeof (TSource).GetProperties(flags)
                select new
                {
                    Name = aProp.Name,
                    Type = Nullable.GetUnderlyingType(aProp.PropertyType) ??
                            aProp.PropertyType
                }).ToList();
                var dataTblFieldNames = (from DataColumn aHeader in dataTable.Columns
                select new
                {
                    Name = aHeader.ColumnName,
                    Type = aHeader.DataType
                }).ToList();
                var commonFields = objFieldNames.Intersect(dataTblFieldNames).ToList(); 
                foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
                {
                    var aTSource = new TSource();
                    foreach (var aField in commonFields)
                    {
                        PropertyInfo propertyInfos = aTSource.GetType().GetProperty(aField.Name);
                        var value = (dataRow[aField.Name] == DBNull.Value)
                            ? null
                            : dataRow[aField.Name]; //if database field is nullable
                        propertyInfos.SetValue(aTSource, value, null);
                    }
                    dataList.Add(aTSource);
                }
                return dataList;
            }
    

      

  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/objectboy/p/4506141.html
Copyright © 2011-2022 走看看