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