/// <summary> /// 用于映射Comment的函数 /// </summary> /// <param name="columnName"></param> /// <param name="member"></param> /// <returns></returns> public ExcelMapper <TEntity> MapCommentFor(string columnName, Expression <Func <TEntity, string> > member) { var map = new ExcelMapperSelector <TEntity>() { ColumnName = columnName, ColumnIdx = IndexDict[columnName], SetValueFunc = null, }; ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TEntity)), valueParameterExpression = Expression.Parameter(typeof(string)); Expression <Action <TEntity, string> > setValueExpression = Expression.Lambda <Action <TEntity, string> >( Expression.Block( Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)member.Body).Member.Name), valueParameterExpression) ), objectParameterExpression, valueParameterExpression ); Action <TEntity, string> setValue = setValueExpression.Compile(); map.SetValueFunc = (e, val) => { setValue(e, (string)val); }; commentSelectors.Add(map); return(this); }
/// <summary> /// 设置映射结果 /// 对每一列,都会调用member= mapFunc(this[columnName]) /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="columnName">对应的Excel列名</param> /// <param name="member">选择要映射到成员</param> /// <param name="mapFunc">映射函数,如果为空,就调用ToString</param> /// <returns></returns> public ExcelMapper <TEntity> MapFor <TResult>(string columnName, Expression <Func <TEntity, TResult> > member, Func <object, TResult> mapFunc = null) { var map = new ExcelMapperSelector <TEntity>() { ColumnName = columnName, ColumnIdx = IndexDict[columnName], SetValueFunc = null, }; if (mapFunc == null) { ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TEntity)), valueParameterExpression = Expression.Parameter(typeof(string)); Expression <Action <TEntity, string> > setValueExpression = Expression.Lambda <Action <TEntity, string> >( Expression.Block( Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)member.Body).Member.Name), valueParameterExpression) ), objectParameterExpression, valueParameterExpression ); Action <TEntity, string> setValue = setValueExpression.Compile(); map.SetValueFunc = (e, val) => { setValue(e, val.ToString()); }; } else { ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TEntity)), valueParameterExpression = Expression.Parameter(typeof(TResult)); Expression <Action <TEntity, TResult> > setValueExpression = Expression.Lambda <Action <TEntity, TResult> >( Expression.Block( Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)member.Body).Member.Name), valueParameterExpression) ), objectParameterExpression, valueParameterExpression ); Action <TEntity, TResult> setValue = setValueExpression.Compile(); map.SetValueFunc = (e, val) => { TResult rst = mapFunc(val); setValue(e, rst); }; } selectors.Add(map); return(this); }