public static Expression Assign(this Expression path, Expression value, AssignLogInfo toLog = null)
        {
            if (!MutatorsAssignRecorder.IsRecording() || toLog == null)
            {
                return(InternalAssign(path, value));
            }
            MutatorsAssignRecorder.RecordCompilingExpression(toLog);
            MethodCallExpression recordingExpression;
            var temp = Expression.Variable(value.Type, "temp");

            if (value.Type.IsNullable())
            {
                recordingExpression = Expression.Call(typeof(MutatorsAssignRecorder).GetMethod("RecordExecutingExpressionWithNullableValueCheck").MakeGenericMethod(Nullable.GetUnderlyingType(value.Type)), Expression.Constant(toLog), value);
            }
            else if (value.Type.IsValueType)
            {
                recordingExpression = Expression.Call(typeof(MutatorsAssignRecorder).GetMethod("RecordExecutingExpression"), Expression.Constant(toLog));
            }
            else
            {
                recordingExpression = Expression.Call(typeof(MutatorsAssignRecorder).GetMethod("RecordExecutingExpressionWithValueObjectCheck"), Expression.Constant(toLog), value);
            }

            return(Expression.Block(new[] { temp },
                                    Expression.Assign(temp, value),
                                    InternalAssign(path, temp),
                                    recordingExpression,
                                    temp));
        }
        public override Expression Apply(Expression path, List <KeyValuePair <Expression, Expression> > aliases)
        {
            if (Value == null)
            {
                return(null);
            }
            var infoToLog = new AssignLogInfo(path, Value.Body);

            path = PrepareForAssign(path);
            var value = Convert(Value.Body.ResolveAliases(aliases), path.Type);

            return(path.Assign(value, infoToLog));
        }
Esempio n. 3
0
        public override Expression Apply(Expression path, List <KeyValuePair <Expression, Expression> > aliases)
        {
            if (Condition == null)
            {
                return(null);
            }
            var infoToLog = new AssignLogInfo(path, Expression.Constant(ToString(), typeof(string)));
            var condition = Expression.Equal(Expression.Convert(Condition.Body.ResolveAliases(aliases), typeof(bool?)), Expression.Constant(true, typeof(bool?)));

            path = PrepareForAssign(path);
            var applyResult = Expression.IfThen(condition, Expression.Assign(path, Expression.Constant(path.Type.GetDefaultValue(), path.Type)));

            if (MutatorsAssignRecorder.IsRecording())
            {
                MutatorsAssignRecorder.RecordCompilingExpression(infoToLog);
                return(Expression.Block(Expression.Call(typeof(MutatorsAssignRecorder).GetMethod("RecordExecutingExpression"), Expression.Constant(infoToLog)), applyResult));
            }
            return(applyResult);
        }
        public override Expression Apply(Expression path, List <KeyValuePair <Expression, Expression> > aliases)
        {
            if (Value == null)
            {
                return(null);
            }
            var infoToLog = new AssignLogInfo(path, Value.Body);

            path = PrepareForAssign(path);
            var value      = Convert(Value.Body.ResolveAliases(aliases), path.Type);
            var assignment = path.Assign(value, infoToLog);

            if (Condition == null)
            {
                return(assignment);
            }
            var condition = Condition.Body;

            condition = Expression.Equal(Expression.Convert(condition.ResolveAliases(aliases), typeof(bool?)), Expression.Constant(true, typeof(bool?)));
            return(Expression.IfThen(condition, assignment));
        }