/// <summary>
        /// Executes the method supplied on the the type.
        /// </summary>
        /// <param name="obj">The language type</param>
        /// <param name="methodName">The method name</param>
        /// <param name="parameters">The parameters to the method.</param>
        /// <returns></returns>
        public virtual object ExecuteMethod(LObject obj, string methodName, object[] parameters)
        {
            var mappedMethod = _methodMap[methodName];
            var args         = new ArgsFetcher(parameters);

            // total required =
            var funcDef    = mappedMethod.FuncDef;
            int total      = funcDef.GetTotalRequiredArgs();
            var methodArgs = new List <object>();
            var hasParams  = parameters != null && parameters.Length > 0;

            methodArgs.Add(obj);

            // TODO: Figure out the total required args when AddArg is called.
            if (total > 0 && hasParams)
            {
                var ndx = 0;
                var totalParamsGiven = parameters.Length;
                var convertArgs      = mappedMethod.ConvertParameters;

                // Go through all the argument definitions.
                foreach (var arg in funcDef.Arguments)
                {
                    var isRequired = arg.Required;
                    // 1. Required and provided?
                    if (isRequired && ndx < parameters.Length)
                    {
                        // Positional arg.
                        if (arg.Type != "params")
                        {
                            var param = parameters[ndx];
                            var val   = convertArgs ? ConvertToProperType(arg, param) : param;
                            methodArgs.Add(val);
                        }
                        // End of list arguments.
                        else
                        {
                            var remainder = new List <object>();
                            while (ndx < totalParamsGiven)
                            {
                                var param = parameters[ndx];
                                var val   = convertArgs ? ConvertToProperType(arg, param) : param;
                                remainder.Add(val);
                                ndx++;
                            }
                            methodArgs.Add(remainder.ToArray());
                        }
                    }
                    // 2. Not required but supplied.
                    else if (!isRequired && ndx < parameters.Length)
                    {
                        var param = parameters[ndx];
                        var val   = convertArgs ? ConvertToProperType(arg, param) : param;
                        methodArgs.Add(val);
                    }
                    // 3. Not required but there is a default.
                    else if (!isRequired && arg.DefaultValue != null && ndx >= parameters.Length)
                    {
                        methodArgs.Add(arg.DefaultValue);
                    }
                    // 4. Not required and extra params
                    else if (!isRequired && arg.DefaultValue == null && arg.Name == "params" && ndx >= parameters.Length)
                    {
                        methodArgs.Add(null);
                    }
                    ndx++;
                }
            }
            else if (hasParams)
            {
                for (var ndx = 0; ndx < parameters.Length; ndx++)
                {
                    var val = ((LObject)parameters[ndx]).GetValue();
                    methodArgs.Add(val);
                }
            }

            var    methodParams = methodArgs.ToArray();
            var    method       = this.GetType().GetMethod(mappedMethod.HostLanguageMethod);
            object result       = method.Invoke(this, methodParams);

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Executes the method supplied on the the type.
        /// </summary>
        /// <param name="obj">The language type</param>
        /// <param name="methodName">The method name</param>
        /// <param name="parameters">The parameters to the method.</param>
        /// <returns></returns>
        public virtual object ExecuteMethod(LObject obj, string methodName, object[] parameters)
        {
            var mappedMethod = _methodMap[methodName];
            var args = new ArgsFetcher(parameters);

            // total required = 
            var funcDef = mappedMethod.FuncDef;
            int total = funcDef.GetTotalRequiredArgs();
            var methodArgs = new List<object>();
            var hasParams = parameters != null && parameters.Length > 0;

            methodArgs.Add(obj);

            // TODO: Figure out the total required args when AddArg is called.
            if (total > 0 && hasParams )
            {
                var ndx = 0;
                var totalParamsGiven = parameters.Length;
                var convertArgs = mappedMethod.ConvertParameters;

                // Go through all the argument definitions.
                foreach (var arg in funcDef.Arguments)
                {
                    var isRequired = arg.Required;
                    // 1. Required and provided?
                    if (isRequired && ndx < parameters.Length)
                    {
                        // Positional arg.
                        if (arg.Type != "params")
                        {
                            var param = parameters[ndx];
                            var val = convertArgs ? ConvertToProperType(arg, param) : param;
                            methodArgs.Add(val);
                        }
                        // End of list arguments.
                        else
                        {
                            var remainder = new List<object>();
                            while (ndx < totalParamsGiven)
                            {
                                var param = parameters[ndx];
                                var val = convertArgs ? ConvertToProperType(arg, param) : param;
                                remainder.Add(val);
                                ndx++;
                            }
                            methodArgs.Add(remainder.ToArray());
                        }
                    }
                    // 2. Not required but supplied.
                    else if (!isRequired && ndx < parameters.Length)
                    {
                        var param = parameters[ndx];
                        var val = convertArgs ? ConvertToProperType(arg, param) : param;
                        methodArgs.Add(val);
                    }
                    // 3. Not required but there is a default.
                    else if (!isRequired && arg.DefaultValue != null && ndx >= parameters.Length)
                    {
                        methodArgs.Add(arg.DefaultValue);
                    }
                    // 4. Not required and extra params
                    else if(!isRequired && arg.DefaultValue == null && arg.Name == "params" && ndx >= parameters.Length)
                    {
                        methodArgs.Add(null);
                    }
                    ndx++;
                }
            }
            else if(hasParams )
            {
                for (var ndx = 0; ndx < parameters.Length; ndx++)
                {
                    var val = ((LObject) parameters[ndx]).GetValue();
                    methodArgs.Add(val);
                }
            }
            
            var methodParams = methodArgs.ToArray();
            var method = this.GetType().GetMethod(mappedMethod.HostLanguageMethod);
            object result = method.Invoke(this, methodParams);
            return result;
        }