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;
        }

  

posted @ 2015-05-15 15:52  等待是一生最初的苍老  阅读(780)  评论(0编辑  收藏  举报