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

      

  • 相关阅读:
    Vue 框架怎么实现对象和数组的监听?
    能说下 vue-router 中常用的 hash 和 history 路由模式实现原理吗?
    vue-router 路由模式有几种?
    Vue 组件间通信有哪几种方式?
    v-model 的原理?
    华硕笔记本修复
    linux下制作u盘启动盘
    virtualbox不能启动虚拟机
    ubuntu14.04建立wifi热点
    git中文文件名和中文目录显示乱码
  • 原文地址:https://www.cnblogs.com/objectboy/p/4506141.html
Copyright © 2011-2022 走看看