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)); }
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(); }
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(); }