internal override Expression ToExpression(MethodBinderContext context, IList <ArgBuilder> args, IList <Expression> parameters, Expression ret)
        {
            List <Expression> sets = new List <Expression>();

            Variable tmp = null;// context.GetTemporary(ret.Type, "val");

            for (int i = 0; i < _indexesUsed.Length; i++)
            {
                Expression value = parameters[parameters.Count - _kwArgCount + _indexesUsed[i]];
                switch (_membersSet[i].MemberType)
                {
                case MemberTypes.Field:
                    FieldInfo fi = (FieldInfo)_membersSet[i];
                    if (!fi.IsLiteral && !fi.IsInitOnly)
                    {
                        sets.Add(Ast.AssignField(Ast.Read(tmp), fi, Ast.ConvertHelper(value, fi.FieldType)));
                    }
                    else
                    {
                        // call a helper which throws the error but "returns object"
                        sets.Add(
                            Ast.Convert(
                                Ast.Call(
                                    typeof(RuntimeHelpers).GetMethod("ReadOnlyAssignError"),
                                    Ast.Constant(true),
                                    Ast.Constant(fi.Name)
                                    ),
                                fi.FieldType
                                )
                            );
                    }
                    break;

                case MemberTypes.Property:
                    PropertyInfo pi = (PropertyInfo)_membersSet[i];
                    if (pi.GetSetMethod(ScriptDomainManager.Options.PrivateBinding) != null)
                    {
                        sets.Add(Ast.AssignProperty(Ast.Read(tmp), pi, Ast.ConvertHelper(value, pi.PropertyType)));
                    }
                    else
                    {
                        // call a helper which throws the error but "returns object"
                        sets.Add(
                            Ast.Convert(
                                Ast.Call(
                                    typeof(RuntimeHelpers).GetMethod("ReadOnlyAssignError"),
                                    Ast.Constant(false),
                                    Ast.Constant(pi.Name)
                                    ),
                                pi.PropertyType
                                )
                            );
                    }
                    break;
                }
            }

            Expression newCall = Ast.Comma(
                0,
                ArrayUtils.Insert <Expression>(
                    Ast.Assign(tmp, ret),
                    sets.ToArray()
                    )
                );

            return(_builder.ToExpression(context, args, parameters, newCall));
        }