泛型处理ToEntity
#region 泛型处理 /// <summary> /// 实体对象赋值转换 /// 参数实体必需包含无参构造函数,否则出错 /// </summary> /// <typeparam name="T">实体对象</typeparam> /// <returns></returns> public static T CopyTo<T>(this T t) { Type type = typeof(T); T obj = (T)Activator.CreateInstance(type, null); foreach (PropertyInfo p in type.GetProperties()) { dynamic tt = t.GetType().GetProperty(p.Name).GetValue(t, null); p.SetValue(obj, tt, null); } return obj; } #endregion #region DataTale /// <summary> /// 将DataTable转换成实体【DataTale中列数可以小于实体中列数】 /// DataTabele中列名应与实体属性名一一对应 /// </summary> /// <typeparam name="Entity">实体对象</typeparam> /// <param name="dt">数据DataTable</param> /// <returns>实体列表</returns> public static List<Entity> ToEntity<Entity>(this DataTable dt, bool IsDefault = false) { Type type = typeof(Entity); List<Entity> list = new List<Entity>(); foreach (DataRow r in dt.Rows) { Entity obj = (Entity)Activator.CreateInstance(type, null); foreach (DataColumn c in dt.Columns) { try { PropertyInfo p = type.GetProperty(c.ColumnName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (p == null) { continue; } object val = r[c.ColumnName]; if (val == DBNull.Value && IsDefault && p.PropertyType.Name.Contains("Nullable")) { string strType = p.PropertyType.ToString().Split('[')[1].Replace("]", ""); val = p.PropertyType.IsValueType ? Activator.CreateInstance(Type.GetType(strType)) : null; } int enumVal = 0; if (p.PropertyType.IsEnum && int.TryParse(val.ToString(), out enumVal)) {//枚举赋值处理 val = Enum.ToObject(p.PropertyType, enumVal); } if (val == DBNull.Value && !p.PropertyType.Name.Contains("Nullable") && p.PropertyType.IsValueType)//不允许为空的值类型使用默认值 { string strType = p.PropertyType.ToString().Replace("[", "").Replace("]", "");//得到类型名 val = Activator.CreateInstance(Type.GetType(strType)); } p.SetValue(obj, Convert.ChangeType(val, p.PropertyType.Name.Contains("Nullable") ? Nullable.GetUnderlyingType(p.PropertyType) : p.PropertyType), null); } catch (Exception ex) { LogUtil.Log(ex.Message + ex.StackTrace + c.ColumnName, "Entity"); } } list.Add(obj); } return list; } /// <summary> /// 将DataTable转换成实体【DataTale中列数可以小于实体中列数】 /// DataTabele中列名应与实体属性名一一对应 /// </summary> /// <typeparam name="Entity">实体对象</typeparam> /// <param name="dt">数据DataTable</param> /// <returns>实体列表</returns> public static Entity Default<Entity>(this DataTable dt, bool IsDefault = false) { List<Entity> list = dt.ToEntity<Entity>(IsDefault); Entity en = default(Entity); if (list != null && list.Count > 0) { en = list[0]; } return en; } public static DataTable ToDataTable<T>(this List<T> list, bool isStoreDB = true) { Type tp = typeof(T); PropertyInfo[] proInfos = tp.GetProperties(); DataTable dt = new DataTable(); foreach (var item in proInfos) { dt.Columns.Add(item.Name, item.PropertyType); //添加列明及对应类型 } foreach (var item in list) { DataRow dr = dt.NewRow(); foreach (var proInfo in proInfos) { object obj = proInfo.GetValue(item,null); if (obj == null) { continue; } if (isStoreDB && proInfo.PropertyType == typeof(DateTime) && Convert.ToDateTime(obj) < Convert.ToDateTime("1753-01-01")) { continue; } dr[proInfo.Name] = obj; } dt.Rows.Add(dr); } return dt; } #endregion