/// <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(StandardUserDataOverloadedMethodDescriptor mdesc, Script script, object obj, DynValue index, DynValue value) { var callback = mdesc.GetCallback(script, obj); 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(); return(callback(execCtx, args)); }
/// <summary> /// Tries to perform an indexing operation by checking newly added extension methods for the given indexName. /// </summary> /// <param name="script">The script.</param> /// <param name="obj">The object.</param> /// <param name="indexName">Member name to be indexed.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> private DynValue TryIndexOnExtMethod(Script script, object obj, string indexName) { List <StandardUserDataMethodDescriptor> methods = UserData.GetExtensionMethodsByName(indexName) .Where(d => d.ExtensionMethodType != null && d.ExtensionMethodType.IsAssignableFrom(this.Type)) .ToList(); if (methods != null && methods.Count > 0) { var ext = new StandardUserDataOverloadedMethodDescriptor(indexName, this.Type); ext.SetExtensionMethodsSnapshot(UserData.GetExtensionMethodsChangeVersion(), methods); m_Methods.Add(indexName, ext); return(DynValue.NewCallback(ext.GetCallback(script, obj))); } return(null); }