/// <summary> /// DataRow 转成 模型 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr"></param> /// <returns></returns> public static T ToModel<T>(this DataRow dr) where T : class, new() { T ob = new T(); if (dr != null) { Type vType = typeof(T); //创建一个属性的列表 PropertyInfo[] prlist = vType.GetProperties(); DataColumnCollection vDataCoulumns = dr.Table.Columns; try { foreach (PropertyInfo vProInfo in prlist) { if (vDataCoulumns.IndexOf(vProInfo.Name) >= 0 && dr[vProInfo.Name] != DBNull.Value) { vProInfo.SetValue(ob, dr[vProInfo.Name], null); } } } catch (Exception ex) { } } return ob; } /// <summary> /// DataTable 转换为List 集合 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="dt">DataTable</param> /// <returns></returns> public static List<T> ToList<T>(this DataTable dt) where T : class, new() { //创建一个属性的列表 List<PropertyInfo> prlist = new List<PropertyInfo>(); //获取TResult的类型实例 反射的入口 Type t = typeof(T); //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表 Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); }); //创建返回的集合 List<T> oblist = new List<T>(); if (dt != null) { foreach (DataRow row in dt.Rows) { try { //创建TResult的实例 T ob = new T(); //找到对应的数据 并赋值 prlist.ForEach(p => { if (dt.Columns.IndexOf(p.Name) >= 0 && row[p.Name] != DBNull.Value) { try { //如果是泛型 if (p.PropertyType.ToString().IndexOf("System.Nullable") > -1) { string types = p.PropertyType.ToString().Substring(p.PropertyType.ToString().IndexOf("[") + 1); types = types.Substring(0, types.Length - 1); Type typeinfo = Type.GetType(types); p.SetValue(ob, Convert.ChangeType(row[p.Name], typeinfo), null); } else { p.SetValue(ob, Convert.ChangeType(row[p.Name], p.PropertyType), null);//类型转换 } } catch (Exception ex) { LogUtility.WriteLogForExcepiton(ex); } } }); //放入到返回的集合中. oblist.Add(ob); } catch (Exception ex) { } } } return oblist; }
/// <summary> /// DataSet转换为泛型集合 /// </summary> /// <typeparam name="T">泛型类型</typeparam> /// <param name="ds">DataSet数据集</param> /// <param name="tableIndex">待转换数据表索引,默认第0张表</param> /// <returns>返回泛型集合</returns> public static IList<T> ToList<T>(this DataSet ds, int tableIndex = 0) { if (ds == null || ds.Tables.Count < 0) return null; if (tableIndex > ds.Tables.Count - 1) return null; if (tableIndex < 0) tableIndex = 0; DataTable dt = ds.Tables[tableIndex]; // 返回值初始化 IList<T> result = new List<T>(); for (int j = 0; j < dt.Rows.Count; j++) { T _t = (T)Activator.CreateInstance(typeof(T)); PropertyInfo[] propertys = _t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { for (int i = 0; i < dt.Columns.Count; i++) { // 属性与字段名称一致的进行赋值 if (pi.Name.Equals(dt.Columns[i].ColumnName)) { // 数据库NULL值单独处理 if (dt.Rows[j][i] != DBNull.Value) pi.SetValue(_t, dt.Rows[j][i], null); else pi.SetValue(_t, null, null); break; } } } result.Add(_t); } return result; } /// <summary> /// DataSet转换为泛型集合 /// </summary> /// <typeparam name="T">泛型类型</typeparam> /// <param name="ds">DataSet数据集</param> /// <param name="tableName">待转换数据表名称,名称为空时默认第0张表</param> /// <returns>返回泛型集合</returns> public static IList<T> ToList<T>(this DataSet ds, string tableName) { int _TableIndex = 0; if (ds == null || ds.Tables.Count < 0) return null; if (string.IsNullOrEmpty(tableName)) return ToList<T>(ds, 0); for (int i = 0; i < ds.Tables.Count; i++) { // 获取Table名称在Tables集合中的索引值 if (ds.Tables[i].TableName.Equals(tableName)) { _TableIndex = i; break; } } return ToList<T>(ds, _TableIndex); }