private (bool Success, Exception Error) TryTransformParameters(string argsLine, string[] strArgs, Command cmd, out object[] cmdArgs) { int requiredParamCount = cmd.Params.Count(o => !o.Optional); cmdArgs = Enumerable.Repeat(Type.Missing, cmd.Params.Length).ToArray(); if (strArgs.Length > 0) { if (cmd.Params.Length == 1 && cmd.Params[0].Type == typeof(string) && strArgs.Length > 1) { cmdArgs[0] = argsLine; } else { if (strArgs.Length < requiredParamCount || strArgs.Length > cmd.Params.Length) { return(false, new ParameterMismatchException(requiredParamCount, cmd.Params.Length, strArgs.Length, cmd)); } for (int i = 0; i < strArgs.Length; i++) { var(valueConverted, value) = ValueConverter.TryConvertValue(cmd.Params[i].Type, strArgs[i]); if (!valueConverted) { return(false, new ParameterConversionException(cmd.Params[i].Name, cmd.Params[i].Type)); } else { cmdArgs[i] = value; } } } } else if (requiredParamCount > 0) { return(false, new ParameterMismatchException(requiredParamCount, cmd.Params.Length, 0, cmd)); } return(true, null); }