• C# DataTable 和List之间相互转换的方法


    首先来说下非泛型转换,这种转换方式就是通过遍历DataTable,然后向Model中的相同字段中赋值即可。

     //使用Linq的ToList方法,非泛型
            public static List<Entity> ConvertTo(DataTable dt)
            {
                if (dt == null) return null;
                if (dt.Rows.Count <= 0) return null;
     
                List<Entity> list = new List<Entity>();
                list = (from DataRow dr in dt.Rows
                        select new Entity
                        {
                            PID = Int32.Parse(dr["PID"].ToString()),
                            PName = dr["PName"].ToString(),
                            PPass = dr["PPass"].ToString(),
                            PAddr = dr["PAddr"].ToString()
                        }).ToList();
                return list;
            }

    代码很简单,就是通过循环赋值而已。这里我用的Model测试类如下:

     
    namespace DataSetToEntity.Code
    {
        public class Entity
        {
            public int PID { get; set; }
     
            public string PName { get; set; }
     
            public string PPass { get; set; }
     
            public string PAddr { get; set; }
        }
    }

    泛型方式

    然后,由于非泛型的版本不具有通用性,所以这里我们准备用泛型版本来实现一下,由于泛型版本是不可预知Model中的属性结构的,所以这里我们需要引入反射来进行操作。

    //使用反射的泛型方法一
            public static List<T> ConvertTo<T>(DataTable dt) where T : new()
            {
                if (dt == null) return null;
                if (dt.Rows.Count <= 0) return null;
     
                List<T> list = new List<T>();
                try
                {
                    List<string> columnsName = new List<string>();  
                    foreach (DataColumn dataColumn in dt.Columns)
                    {
                        columnsName.Add(dataColumn.ColumnName);//得到所有的表头
                    }
                    list = dt.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsName));  //转换
                    return list;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }
     
            public static T getObject<T>(DataRow row, List<string> columnsName) where T : new()
            {
                T obj = new T();
                try
                {
                    string columnname = "";
                    string value = "";
                    PropertyInfo[] Properties = typeof(T).GetProperties();
                    foreach (PropertyInfo objProperty in Properties)  //遍历T的属性
                    {
                        columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); //寻找可以匹配的表头名称
                        if (!string.IsNullOrEmpty(columnname))
                        {
                            value = row[columnname].ToString();
                            if (!string.IsNullOrEmpty(value))
                            {
                                if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) //存在匹配的表头
                                {
                                    value = row[columnname].ToString().Replace("$", "").Replace(",", ""); //从dataRow中提取数据
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null); //赋值操作
                                }
                                else
                                {
                                    value = row[columnname].ToString().Replace("%", ""); //存在匹配的表头
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);//赋值操作
                                }
                            }
                        }
                    }
                    return obj;
                }
                catch
                {
                    return obj;
                }
            }
     
    上面主要是通过反射获取T的属性名称,然后和DataRow中的表头相匹配,如果匹配的上,就赋值。下面是其简化版本:
     
    //使用反射的泛型方法二
            public static List<T> ConvertToEx<T>(DataTable dt) where T : new()
            {
                if (dt == null) return null;
                if (dt.Rows.Count <= 0) return null;
     
                List<T> list = new List<T>();
                Type type = typeof(T);
                PropertyInfo[] propertyInfos = type.GetProperties();  //获取泛型的属性
                List<DataColumn> listColumns = dt.Columns.Cast<DataColumn>().ToList();  //获取数据集的表头,以便于匹配
                T t;
                foreach (DataRow dr in dt.Rows)   
                {
                    t = new T();
                    foreach (PropertyInfo propertyInfo in propertyInfos)
                    {
                        try
                        {
                            DataColumn dColumn = listColumns.Find(name => name.ToString().ToUpper() == propertyInfo.Name.ToUpper());  //查看是否存在对应的列名
                            if (dColumn != null)
                                propertyInfo.SetValue(t, dr[propertyInfo.Name], null);  //赋值
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    list.Add(t);
                }
                return list;
            }
     
    至于使用方式,很简单,直接利用下面的代码即可:
     List<Entity> list = CommonUtils.ConvertToEx<Entity>(dt);

    引用只做学习用。
     
  • 相关阅读:
    第四章 网络层协议介绍
    第三章 交换机基本原理与配置
    网络服务综合性测试
    双向秘钥对验证
    DNS分离解析与构建智能DNS服务器
    NFS共享服务
    部署YUM仓库服务
    PXE高效能批量网络装机
    DNS综合实验
    构建DNS主 从服务器
  • 原文地址:https://www.cnblogs.com/NotEnough/p/8431231.html
Copyright © 2020-2023  润新知