Пример #1
0
            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)));
                }
            }