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