public Expression MapObjects(ExpressionMapper <TSource, TDest> mapper, Expression source) { var param = mapper._getCurrent == null ? (ParameterExpression)source : Expression.Parameter(source.Type, "source"); Expression expr; object m; if (mapper._parameters.MapperList.TryGetValue(new { S = typeof(TS), D = typeof(TD) }, out m)) { var map = (Mapper <TS, TD>)m; if (map.Map == null) { expr = Expression.Invoke( Expression.PropertyOrField(Expression.Constant(map), "Map"), source, mapper._parameters.MappingContext); } else { expr = Expression.Invoke(Expression.Constant(map.Map), source, mapper._parameters.MappingContext); } } else { var exmap = new ExpressionMapper <TS, TD>(mapper._parameters); expr = exmap.GetMemberInit(param); } if (mapper._getCurrent == null) { return(expr); } if (!mapper.HandleBackReferences) { Expression <Func <object> > func = () => MapObjects((TS)null, null); return(Expression.Call((MethodInfo)ReflectionHelper.MemeberInfo(func), source, Expression.Lambda <Func <TS, TD> >(expr, param))); } else { mapper._parameters.UseContext = true; Expression <Func <object> > func = () => MapCrossReferences(null, null, null, null, null); return(Expression.Call( (MethodInfo)ReflectionHelper.MemeberInfo(func), mapper._parameters.MappingContext, source, Expression.Lambda <Func <TS, TD> >(expr, param), Expression.Constant(mapper._getCurrent), Expression.Constant(mapper._setCurrent))); } }