コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: ConvertHelper.cs プロジェクト: wufenglu/BMSNetCore
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
ファイル: ConvertHelper.cs プロジェクト: wufenglu/BMSNetCore
        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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
ファイル: ConvertHelper.cs プロジェクト: wufenglu/BMSNetCore
        public static T ToItem <T>(DataRow dr)
        {
            LoadDataRow <T> load = GetDataRowMethod <T>();

            return(load(dr));
        }
コード例 #15
0
        /// <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);
        }