/// <summary> /// Executes the specified indexer method. /// </summary> /// <param name="mdesc">The method descriptor</param> /// <param name="script">The script.</param> /// <param name="obj">The object.</param> /// <param name="index">The indexer parameter</param> /// <param name="value">The dynvalue to set on a setter, or null.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> protected virtual DynValue ExecuteIndexer(IMemberDescriptor mdesc, Script script, object obj, DynValue index, DynValue value) { IList<DynValue> values; if (index.Type == DataType.Tuple) { if (value == null) { values = index.Tuple; } else { values = new List<DynValue>(index.Tuple); values.Add(value); } } else { if (value == null) { values = new DynValue[] { index }; } else { values = new DynValue[] { index, value }; } } CallbackArguments args = new CallbackArguments(values, false); ScriptExecutionContext execCtx = script.CreateDynamicExecutionContext(); DynValue v = mdesc.GetValue(script, obj); if (v.Type != DataType.ClrFunction) throw new ScriptRuntimeException("a clr callback was expected in member {0}, while a {1} was found", mdesc.Name, v.Type); return v.Callback.ClrCallback(execCtx, args); }