public void To(Action <TContext, T> action) { Expression getValueExpression = _sourceExpression.Body; var contextParameter = _sourceExpression.Parameters[0]; if (_propagateNullValues) { getValueExpression = new NullPropagationVisitor(contextParameter).Visit(_sourceExpression.Body); } var finalExpression = Expression.Lambda <Action <TContext> >( Expression.Call( Expression.Constant(action), typeof(Action <TContext, T>).GetMethod("Invoke"), contextParameter, getValueExpression), contextParameter); AddRule(Binder.ExpressionCompiler.Compile(finalExpression), _key); }
internal void SetTarget <TTarget>(Expression <Func <TContext, TTarget> > targetExpression) { var contextParameter = _sourceExpression.Parameters[0]; var source = _sourceExpression.Body; if (_propagateNullValues) { source = new NullPropagationVisitor(_sourceExpression.Parameters[0]).Visit(source); } var target = targetExpression.GetBodyWithReplacedParameter(contextParameter); if (!target.Type.IsAssignableFrom(source.Type) || source.Type.IsValueType && Nullable.GetUnderlyingType(target.Type) == source.Type) { source = Expression.Convert(source, target.Type); } var assignment = Expression.Lambda <Action <TContext> >( Expression.Assign( target, source), contextParameter); var key = _key ?? targetExpression.GetTargetKey(); var targetParent = ((MemberExpression)targetExpression.Body).Expression; var targetParameter = targetExpression.Parameters[0]; if (targetParent != targetParameter) { _dependencies.Add(targetParent); } AddRule(Binder.ExpressionCompiler.Compile(assignment), key); }
public NullPropagationVisitorTest() { visitor = new NullPropagationVisitor(recursive: true); visitorNonRecursive = new NullPropagationVisitor(recursive: false); }