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;

        }

  

你可能感兴趣的:(Datatable)