/// <summary> /// emit 转换实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static List <T> ToEntityList <T>(this DataTable dt) { List <T> list = new List <T>(); if (dt == null || dt.Rows.Count == 0) { return(list); } LoadDataRow <T> load = null; if (IsCache) { load = FindDataRowMethod <T>(dt); } if (load == null) { var properties = typeof(T).GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); var mapColumns = CheckProperty(dt, properties); if (IsCache) { load = CreateDataRowMethod <T>(dt, mapColumns); } else { load = CreateDataRowMethod <T>(null, mapColumns); } } foreach (DataRow dr in dt.Rows) { list.Add(load(dr)); } return(list); }
/// <summary> /// 转换实体 /// </summary> /// <param name="dt">datatable</param> /// <param name="type">实体类型</param> /// <param name="ignore">忽略属性大小写,默认忽略</param> /// <returns></returns> public static List <object> ToEntityList(this DataTable dt, Type type, bool ignore = true) { List <object> list = new List <object>(); if (dt == null || dt.Rows.Count == 0) { return(list); } LoadDataRow <object> load = null; if (IsCache) { load = FindObjectDataRowMethod(dt, type); } if (load == null) { var properties = type.GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); var mapColumns = CheckProperty(dt, properties, ignore); if (IsCache) { load = CreateDataRowMethod(dt, mapColumns, type); } else { load = CreateDataRowMethod(null, mapColumns, type); } } foreach (DataRow dr in dt.Rows) { list.Add(load(dr)); } return(list); }
/// <summary> /// 创建DataRow转换 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <param name="mapColumns"></param> /// <returns></returns> private static LoadDataRow <T> CreateDataRowMethod <T>(DataTable dt, MapColumn[] mapColumns) { string key = null; if (dt != null) { key = dt.TableName; if (string.IsNullOrEmpty(key)) { key = dt.Columns.Count + "_"; foreach (DataColumn col in dt.Columns) { key = key + col.ColumnName + "_"; } key = key + dataRowAssembly.MethodName + typeof(T).FullName; } } LoadDataRow <T> load = (LoadDataRow <T>)BuildMethod <T>(dataRowAssembly, mapColumns, key).CreateDelegate(typeof(LoadDataRow <T>)); if (key != null) { ConvertCache <string, object> .Singleton.Set(key, load); } return(load); }
/// <summary> /// 从Dictionary获取委托 LoadDataRow<T>的方法实例,没有则调用BuildMethod构造一个。 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static LoadDataRow <T> GetDataRowMethod <T>() { string key = dataRowAssembly.MethodName + typeof(T).Name; LoadDataRow <T> load = null; load = (LoadDataRow <T>)BuildMethod <T>(dataRowAssembly).CreateDelegate(typeof(LoadDataRow <T>)); return(load); }
/// <summary> /// 带有特性的查找 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static LoadDataRow <T> FindMap <T>() { LoadDataRow <T> loadrow = null; object v = null; if (cache.TryGetValue(typeof(T).FullName + "_map", out v)) { loadrow = v as LoadDataRow <T>; } return(loadrow); }
public static List <T> ToList <T>(DataTable dt) { List <T> list = new List <T>(); if (dt == null || dt.Rows.Count == 0) { return(list); } LoadDataRow <T> load = GetDataRowMethod <T>(); foreach (DataRow dr in dt.Rows) { list.Add(load(dr)); } return(list); }
/// <summary> /// 从Dictionary获取委托 LoadDataRow<T>的方法实例,没有则调用BuildMethod构造一个。 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static LoadDataRow <T> GetDataRowMethod <T>() { string key = dataRowAssembly.MethodName + typeof(T).Name; LoadDataRow <T> load = null; if (HttpRuntime.Cache[key] == null) { load = (LoadDataRow <T>)BuildMethod <T>(dataRowAssembly).CreateDelegate(typeof(LoadDataRow <T>)); HttpRuntime.Cache[key] = load; } else { load = HttpRuntime.Cache[key] as LoadDataRow <T>; } return(load); }
private static LoadDataRow <object> FindObjectDataRowMethod(DataTable dt, Type type) { string key = dt.TableName; if (string.IsNullOrEmpty(key) || key.ToLower() == "tablename") { key = dt.Columns.Count + "_" + dataRowAssembly.MethodName + type.FullName; } LoadDataRow <object> load = null; object v = null; if (ConvertCache <string, object> .Singleton.TryGet(key, out v)) { load = v as LoadDataRow <object>; } return(load); }
/// <summary> /// 从Cache获取委托 LoadDataRow<T>的方法实例,没有则调用BuildMethod构造一个。 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static LoadDataRow <T> GetDataRowMethod <T>() { string key = dataRowAssembly.MethodName + typeof(T).Name; LoadDataRow <T> load = null; if (Cache == null) { Cache = new Dictionary <string, object>(); } if (!Cache.ContainsKey(key)) { load = (LoadDataRow <T>)BuildMethod <T>(dataRowAssembly).CreateDelegate(typeof(LoadDataRow <T>)); Cache.Add(key, load); } else { load = Cache[key] as LoadDataRow <T>; } return(load); }
private static LoadDataRow <object> CreateDataRowMethod(DataTable dt, MapColumn[] mapColumns, Type type) { string key = null; if (dt != null) { key = dt.TableName; if (string.IsNullOrEmpty(key)) { //如果DataTable名称没有,则按照所有列名称定Key key = dt.Columns.Count + "_" + dataRowAssembly.MethodName + type.FullName; } } LoadDataRow <object> load = (LoadDataRow <object>)BuildMethod(dataRowAssembly, type, mapColumns, key).CreateDelegate(typeof(LoadDataRow <object>)); if (key != null) { ConvertCache <string, object> .Singleton.Set(key, load); } return(load); }
/// <summary> /// 查找DataRow转换 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> private static LoadDataRow <T> FindDataRowMethod <T>(DataTable dt) { string key = dt.TableName; if (string.IsNullOrEmpty(key)) { key = dt.Columns.Count + "_"; foreach (DataColumn col in dt.Columns) { key = key + col.ColumnName + "_"; } key = key + dataRowAssembly.MethodName + typeof(T).FullName; } LoadDataRow <T> load = null; object v = null; if (ConvertCache <string, object> .Singleton.TryGet(key, out v)) { load = v as LoadDataRow <T>; } return(load); }
/// <summary> /// 创建DataRow转换 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <param name="mapColumns"></param> /// <returns></returns> private static LoadDataRow <T> CreateDataRowMethod <T>(DataTable dt, MapColumn[] mapColumns) { string key = null; if (dt != null) { key = dt.TableName; if (string.IsNullOrEmpty(key) || key.ToLower() == "tablename") { //如果DataTable名称没有,则按照所有列名称定Key key = dt.Columns.Count + "_" + dataRowAssembly.MethodName + typeof(T).FullName; } } LoadDataRow <T> load = (LoadDataRow <T>)BuildMethod <T>(dataRowAssembly, mapColumns, key).CreateDelegate(typeof(LoadDataRow <T>), Activator.CreateInstance(objtar)); if (key != null) { ConvertCache <string, object> .Singleton.Set(key, load); } // LoadDataRow<T> load = BuildMethod<T>(dataRowAssembly, mapColumns, key); return(load); }
/// <summary> /// 转换实体 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="dt">DataTable</param> /// <param name="ignore">忽略属性大小写,默认忽略</param> /// <returns></returns> public static List <T> ToEntityList <T>(this DataTable dt, bool ignore = true) { List <T> list = new List <T>(); if (dt == null || dt.Rows.Count == 0) { return(list); } LoadDataRow <T> load = null; if (IsCache) { load = FindDataRowMethod <T>(dt); } if (load == null) { var properties = typeof(T).GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); var mapColumns = CheckProperty(dt, properties, ignore); if (IsCache) { load = CreateDataRowMethod <T>(dt, mapColumns); } else { load = CreateDataRowMethod <T>(null, mapColumns); } } // var mth = BuildMethod<T>(dataRowAssembly, mapColumns, null); foreach (DataRow dr in dt.Rows) { // mth.Invoke(dr, null); var p = load(dr); list.Add(p); } return(list); }
public static T ToItem <T>(DataRow dr) { LoadDataRow <T> load = GetDataRowMethod <T>(); return(load(dr)); }
/// <summary> /// 带有特性的转换 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="lst"></param> /// <returns></returns> public static DataTable FormEntityToTableMap <T>(this IList <T> lst) { LoadDataRow <T> loadrow = FindMap <T>(); DataTable dt = new DataTable(); if (loadrow == null) { var properties = typeof(T).GetProperties(); Dictionary <string, string> map = new Dictionary <string, string>(); Dictionary <string, Type> mapType = new Dictionary <string, Type>(); foreach (var p in properties) { if (p.GetCustomAttribute(typeof(NoColumn)) != null) { //没有该列映射 continue; } else if (p.GetCustomAttribute(typeof(DataField)) != null) { DataField ttr = p.GetCustomAttribute <DataField>(); var type = p.GetCustomAttribute <ColumnType>(); map.Add(ttr.ColumnName, p.Name); if (type != null && !type.Column.Equals(p.PropertyType)) { dt.Columns.Add(ttr.ColumnName, type.Column); mapType[ttr.ColumnName] = type.Column; } else { dt.Columns.Add(ttr.ColumnName, p.PropertyType); } } else if (p.GetCustomAttribute(typeof(ColumnType)) != null) { var type = p.GetCustomAttribute <ColumnType>(); dt.Columns.Add(p.Name, type.Column); map.Add(p.Name, p.Name); if (!type.Column.Equals(p.PropertyType)) { mapType[p.Name] = type.Column; } } else { dt.Columns.Add(p.Name, p.PropertyType); map.Add(p.Name, p.Name); } } if (map.Count == 0) { map = null; } if (mapType.Count == 0) { mapType = null; } loadrow = CreateMap <T>(map, mapType); cacheDataTable[typeof(T).FullName + "_map"] = dt; } else { dt = cacheDataTable[typeof(T).FullName + "_map"].Clone(); } ////1.如果调用table转换 //LoadDataTable<T> load = (LoadDataTable<T>)PersonToDataTable<T>(map,mapType).CreateDelegate(typeof(LoadDataTable<T>)); //foreach (var item in lst) //{ // load(dt, item); //} //2.如果调用行转换(控制度大些) foreach (var item in lst) { var row = dt.NewRow(); loadrow(row, item); dt.Rows.Add(row); } return(dt); }