public Expression SetValue(Compiler compiler, Expression rhs) { var constraints = Compiler.GetInvokeMemberConstraints(InvokeMemberExpressionAst); var memberNameAst = InvokeMemberExpressionAst.Member as StringConstantExpressionAst; var target = GetTargetExpr(compiler); var args = GetArgumentExprs(compiler); if (memberNameAst != null) { return compiler.InvokeMember(memberNameAst.Value, constraints, target, args.Append(rhs), @static: false, propertySet: true); } var memberNameExpr = GetMemberNameExpr(compiler); return compiler.InvokeDynamicMember(memberNameExpr, constraints, target, args.Append(rhs), @static: false, propertySet: true); }
public Expression GetValue(Compiler compiler, List<Expression> exprs, List<ParameterExpression> temps) { var constraints = Compiler.GetInvokeMemberConstraints(InvokeMemberExpressionAst); var targetExpr = GetTargetExpr(compiler); _targetExprTemp = Expression.Variable(targetExpr.Type); exprs.Add(Expression.Assign(_targetExprTemp, targetExpr)); int exprsIndex = exprs.Count; var args = GetArgumentExprs(compiler); _argExprTemps = args.Select(arg => Expression.Variable(arg.Type)).ToArray(); exprs.AddRange(args.Zip(_argExprTemps, (arg, temp) => Expression.Assign(temp, arg))); temps.Add(_targetExprTemp); int tempsIndex = temps.Count; temps.AddRange(_argExprTemps); var memberNameAst = InvokeMemberExpressionAst.Member as StringConstantExpressionAst; if (memberNameAst != null) { return compiler.InvokeMember(memberNameAst.Value, constraints, _targetExprTemp, _argExprTemps, @static: false, propertySet: false); } var memberNameExpr = GetMemberNameExpr(compiler); _memberNameExprTemp = Expression.Variable(memberNameExpr.Type); exprs.Insert(exprsIndex, Expression.Assign(_memberNameExprTemp, memberNameExpr)); temps.Insert(tempsIndex, _memberNameExprTemp); return compiler.InvokeDynamicMember(_memberNameExprTemp, constraints, _targetExprTemp, _argExprTemps, @static: false, propertySet: false); }