public Expression SourceMapValues( ExpressionMapper <TSource, TDest> mapper, Expression source, object nullValue, object defaultValue, MapValue[] srcMapValues) { var param = //source.NodeType != ExpressionType.MemberAccess && source.NodeType != ExpressionType.Parameter && source.NodeType != ExpressionType.Constant? Expression.Parameter(typeof(TS), "p") : null; var expr = mapper.GetValueMapper(Expression.Constant(defaultValue), typeof(TD), true, nullValue, null, null, null); for (var i = srcMapValues.Length - 1; i >= 0; i--) { var value = srcMapValues[i]; expr = Expression.Condition( Expression.Equal(param ?? source, mapper.GetValueMapper(Expression.Constant(value.OrigValue), typeof(TS), false, null, null, null, null)), mapper.GetValueMapper(Expression.Constant(value.MapValues[0]), typeof(TD), true, nullValue, null, null, null), expr); } return(param == null ? expr : Expression.Invoke(Expression.Lambda <Func <TS, TD> >(expr, param), source)); }
public Expression CheckNull( ExpressionMapper <TSource, TDest> mapper, Expression source, object nullValue, MapValue[] mapValues, object defaultValue, MapValue[] srcMapValues) { var param = source.NodeType != ExpressionType.MemberAccess && source.NodeType != ExpressionType.Parameter && source.NodeType != ExpressionType.Constant? Expression.Parameter(typeof(TS), "p") : null; var nexpr = Expression.Constant(nullValue ?? default(TD)); var expr = source.NodeType == ExpressionType.Constant && ((ConstantExpression)source).Value == null ? nexpr as Expression: Expression.Condition( Expression.Equal(param ?? source, Expression.Constant(null)), nexpr.Value == null ? Expression.Convert(nexpr, typeof(TD)) : nexpr as Expression, mapper.GetValueMapper(param ?? source, typeof(TD), false, null, mapValues, defaultValue, srcMapValues)); return(param == null ? expr : Expression.Invoke(Expression.Lambda <Func <TS, TD> >(expr, param), source)); }
public Expression DestMapValues( ExpressionMapper <TSource, TDest> mapper, Expression source, object nullValue, MapValue[] mapValues, object defaultValue) { var param = //source.NodeType != ExpressionType.MemberAccess && source.NodeType != ExpressionType.Parameter && source.NodeType != ExpressionType.Constant? Expression.Parameter(typeof(TS), "p") : null; var expr = mapper.GetValueMapper(Expression.Constant(defaultValue), typeof(TD), true, nullValue, null, null, null); for (var i = mapValues.Length - 1; i >= 0; i--) { var value = mapValues[i]; var orex = null as Expression; foreach (var mapValue in value.MapValues) { var ex = Expression.Equal(param ?? source, mapper.GetValueMapper(Expression.Constant(mapValue), typeof(TS), false, null, null, null, null)); orex = orex == null ? ex : Expression.OrElse(orex, ex); } if (orex != null) { expr = Expression.Condition( orex, mapper.GetValueMapper(Expression.Constant(value.OrigValue), typeof(TD), true, nullValue, null, null, null), expr); } } return(param == null ? expr : Expression.Invoke(Expression.Lambda <Func <TS, TD> >(expr, param), source)); }
public Expression MapLists(ExpressionMapper <TSource, TDest> mapper, Expression source) { var itemMapper = new ExpressionMapper <TSourceItem, TDestItem>(mapper._parameters); var itemParam = Expression.Parameter(typeof(TSourceItem), "item"); var itemExpr = itemMapper.GetValueMapper( itemParam, typeof(TDestItem), true, mapper._parameters.MappingSchema.GetNullValue(typeof(TDestItem)), mapper._parameters.MappingSchema.GetMapValues(typeof(TDestItem)), mapper._parameters.MappingSchema.GetDefaultValue(typeof(TDestItem)), mapper._parameters.MappingSchema.GetMapValues(typeof(TSourceItem))); var itemLambda = Expression.Lambda <Func <TSourceItem, TDestItem> >(itemExpr, itemParam); var isSourceScalar = !typeof(TSourceItem).IsArray && TypeHelper.IsScalar(typeof(TSourceItem)); var isDestScalar = !typeof(TDestItem).IsArray && TypeHelper.IsScalar(typeof(TDestItem)); if (!mapper.HandleBackReferences || isSourceScalar || isDestScalar) { if (typeof(TD).IsArray) { Expression <Func <object> > arrMapper = () => MapScalarArray(null, null); return(Expression.Call((MethodInfo)ReflectionHelper.MemeberInfo(arrMapper), source, itemLambda)); } var isList = typeof(TD) == typeof(IEnumerable <TDestItem>) || typeof(TD) == typeof(ICollection <TDestItem>) || typeof(TD) == typeof(IList <TDestItem>) || typeof(TD) == typeof(List <TDestItem>); var method = typeof(ItemHelper <TSourceItem, TDestItem>).GetMethod("MapScalarList", BindingFlags.NonPublic | BindingFlags.Static); method = method.MakeGenericMethod(isList ? typeof(List <TDestItem>) : typeof(TD)); return(Expression.Call(method, source, itemLambda)); } else { mapper._parameters.UseContext = true; var type = typeof(ClassItemHelper <,>).MakeGenericType( typeof(TSource), typeof(TDest), typeof(TS), typeof(TD), typeof(TSourceItem), typeof(TDestItem)); var helper = ((IClassItemHelper)Activator.CreateInstance(type)); if (typeof(TD).IsArray) { return(Expression.Call(helper.GetObjectArrayInfo(), mapper._parameters.MappingContext, source, itemLambda)); } var isList = typeof(TD) == typeof(IEnumerable <TDestItem>) || typeof(TD) == typeof(ICollection <TDestItem>) || typeof(TD) == typeof(IList <TDestItem>) || typeof(TD) == typeof(List <TDestItem>); return(Expression.Call(helper.GetObjectListInfo(isList), mapper._parameters.MappingContext, source, itemLambda)); } }