Пример #1
0
        /// <summary>
        /// 利用反射将ExcelDataRow转换为制定类型,性能较差
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="row"></param>
        /// <returns></returns>
        private static T ConvertByRefelection <T>(this ExcelDataRow row, IEnumerable <PropertyInfo> props = null)
        {
            if (props == null)
            {
                props = typeof(T).GetProperties();
            }

            object o = Activator.CreateInstance(typeof(T));

            props.ToList().ForEach(p =>
            {
                ExcelDataCol col = null;

                if (p.IsDefined(typeof(ColNameAttribute)))
                {
                    col = row.DataCols.SingleOrDefault(c => c.ColName == p.GetCustomAttribute <ColNameAttribute>().ColName);
                }
                else
                {
                    col = row.DataCols.SingleOrDefault(c => c.ColName == p.Name);
                }

                if (col != null)
                {
                    p.SetValue(o, ExpressionMapper.ChangeType(col.ColValue, p.PropertyType));
                }
            });

            return((T)o);
        }
Пример #2
0
        private static object GetValue(ExcelDataRow row, Type propType, string colName)
        {
            string val = row.DataCols.SingleOrDefault(c => c.ColName == colName)?.ColValue;

            if (!string.IsNullOrWhiteSpace(val))
            {
                return(ExpressionMapper.ChangeType(val, propType));
            }

            return(val);
        }
Пример #3
0
        private static Func <List <ExcelDataCol>, T> GetFunc <T>(ExcelDataRow row)
        {
            string propertyNames = string.Empty;

            row.DataCols.ForEach(c => propertyNames += c.PropertyName + "_");
            var key = typeof(T).FullName + "_" + propertyNames.Trim('_');

            var props = typeof(T).GetProperties().Where(x => x.CanWrite && x.CanRead);

            Func <List <ExcelDataCol>, T> func = ExpressionMapper.GetFunc <T>(key, props);

            return(func);
        }
Пример #4
0
        /// <summary>
        /// 利用表达式树,将ExcelDataRow集合快速转换为指定类型集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="rows"></param>
        /// <returns></returns>
        private static IEnumerable <T> ConvertByExpressionTree <T>(this IEnumerable <ExcelDataRow> rows)
        {
            if (rows == null || rows.Count() <= 0)
            {
                return(null);
            }

            Func <List <ExcelDataCol>, T> func = GetFunc <T>(rows.ToList()[0]);

            List <T> list = new List <T>();

            rows?.ToList().ForEach(r =>
            {
                var item = ExpressionMapper.FastConvert(r, func);
                list.Add(item);
            }
                                   );

            return(list);
        }