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);
        }
示例#3
0
 public NullPropagationVisitorTest()
 {
     visitor             = new NullPropagationVisitor(recursive: true);
     visitorNonRecursive = new NullPropagationVisitor(recursive: false);
 }