Exemple #1
0
        protected List <KeyValuePair <MemberExpression, Expression> > TranslateExpression(IEnumerable <KeyValuePair <MemberExpression, Expression> > expressions)
        {
            var result = new List <KeyValuePair <MemberExpression, Expression> >(expressions.Count());

            foreach (var customMember in expressions)
            {
                var substVisitorDest = new SubstituteParameterVisitor(DestFakeParameter);
                var dest             = substVisitorDest.Visit(customMember.Key) as MemberExpression;

                var substVisitorSrc = new SubstituteParameterVisitor(SourceParameter);
                var src             = substVisitorSrc.Visit(customMember.Value);
                result.Add(new KeyValuePair <MemberExpression, Expression>(dest, src));
            }
            return(result);
        }
        protected BinaryExpression GetDestionationVariable()
        {
            if (this.ConstructorExp != null)
            {
                var substVisitorSrc = new SubstituteParameterVisitor(this.SourceParameter);
                var constructorExp  = substVisitorSrc.Visit(this.ConstructorExp.Body);

                return(Expression.Assign(this.DestFakeParameter, constructorExp));
            }

            if (this.ConstructorFunc != null)
            {
                Expression <Func <T, TN> > customConstruct = t => this.ConstructorFunc(t);
                var invocationExpression = Expression.Invoke(customConstruct, this.SourceParameter);
                return(Expression.Assign(this.DestFakeParameter, invocationExpression));
            }
            var createDestination = Expression.New(typeof(TN));

            return(Expression.Assign(this.DestFakeParameter, createDestination));
        }
Exemple #3
0
        public void CompileDestinationInstance()
        {
            if (_mapDestInstFunc != null)
            {
                return;
            }

            ProcessAutoProperties();

            var expressions = new List <Expression>();

            if (_beforeMapHandler != null)
            {
                Expression <Action <T, TN> > beforeExpression = (src, dest) => _beforeMapHandler(src, dest);
                var beforeInvokeExpr = Expression.Invoke(beforeExpression, _sourceParameter, _destFakeParameter);
                expressions.Add(beforeInvokeExpr);
            }

            expressions.AddRange(_propertyDestInstCache.Values);

            var customProps = _customPropertyDestInstCache.Where(k => !_ignoreList.Contains(k.Key)).Select(k => k.Value);

            expressions.AddRange(customProps);

            if (_afterMapHandler != null)
            {
                Expression <Action <T, TN> > afterExpression = (src, dest) => _afterMapHandler(src, dest);
                var afterInvokeExpr = Expression.Invoke(afterExpression, _sourceParameter, _destFakeParameter);
                expressions.Add(afterInvokeExpr);
            }

            expressions.Add(_destFakeParameter);

            var finalExpression            = Expression.Block(expressions);
            var substituteParameterVisitor = new SubstituteParameterVisitor(_sourceParameter, _destFakeParameter);
            var resultExpression           = substituteParameterVisitor.Visit(finalExpression);

            var expression = Expression.Lambda <Func <T, TN, TN> >(resultExpression, _sourceParameter, _destFakeParameter);

            _mapDestInstFunc = expression.Compile();
        }
Exemple #4
0
        public void Compile()
        {
            if (_mapFunc != null)
            {
                return;
            }

            var destVariable = GetDestionationVariable();

            ProcessAutoProperties();

            var expressions = new List <Expression> {
                destVariable
            };
            var expressionsWithDest = new List <Expression> {
                destVariable
            };

            if (_beforeMapHandler != null)
            {
                Expression <Action <T, TN> > beforeExpression = (src, dest) => _beforeMapHandler(src, dest);
                var beforeInvokeExpr = Expression.Invoke(beforeExpression, _sourceParameter, destVariable.Left);
                expressions.Add(beforeInvokeExpr);
                expressionsWithDest.Add(beforeInvokeExpr);
            }

            expressions.AddRange(_propertyCache.Values);
            expressionsWithDest.AddRange(_propertyDestInstCache.Values);

            var customProps     = _customPropertyCache.Where(k => !_ignoreList.Contains(k.Key)).Select(k => k.Value);
            var customDestProps = _customPropertyDestInstCache.Where(k => !_ignoreList.Contains(k.Key)).Select(k => k.Value);

            expressions.AddRange(customProps);
            expressionsWithDest.AddRange(customDestProps);

            if (_afterMapHandler != null)
            {
                Expression <Action <T, TN> > afterExpression = (src, dest) => _afterMapHandler(src, dest);
                var afterInvokeExpr = Expression.Invoke(afterExpression, _sourceParameter, destVariable.Left);
                expressions.Add(afterInvokeExpr);
                expressionsWithDest.Add(afterInvokeExpr);
            }

            _giveAway.AddRange(expressions);
            _giveWithDestinationAway.AddRange(expressionsWithDest);

            expressions.Add(destVariable.Left);

            var variables = new List <ParameterExpression> {
                destVariable.Left as ParameterExpression
            };

            var finalExpression            = Expression.Block(variables, expressions);
            var substituteParameterVisitor = new SubstituteParameterVisitor(_sourceParameter,
                                                                            destVariable.Left as ParameterExpression);
            Expression resultExpression = substituteParameterVisitor.Visit(finalExpression) as BlockExpression;

            var expression = Expression.Lambda <Func <T, TN> >(resultExpression, _sourceParameter);

            _mapFunc = expression.Compile();
        }