/// <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); }
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); }
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); }
/// <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); }