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