// Reads a line in the script as a command. protected virtual bool PerformCommand(string commandName, CommandParam parameters) { List <string> matchingFormats = new List <string>(); CommandParam newParams = null; // Search for the correct command. for (int i = 0; i < commands.Count; i++) { ScriptCommand command = commands[i]; if (command.HasName(commandName)) { if (command.HasParameters(parameters, out newParams)) { // Run the command. command.Action(newParams); return(true); } else { // Preemptively append the possible overloads to the error message. for (int j = 0; j < command.ParameterOverloads.Count; j++) { matchingFormats.Add(command.Name + " " + CommandParamParser.ToString(command.ParameterOverloads[j])); } } } } // Throw an error because the command was not found. if (matchingFormats.Count > 0) { Console.WriteLine(CommandParamParser.ToString(parameters)); string msg = "No matching overload found for the command " + commandName + "\n"; msg += "Possible overloads include:\n"; for (int i = 0; i < matchingFormats.Count; i++) { msg += " * " + matchingFormats[i]; if (i + 1 < matchingFormats.Count) { msg += "\n"; } } ThrowCommandParseError(msg); } else { ThrowCommandParseError(commandName + " is not a valid command"); } return(false); }
private static object[] _GetParams(Type type, string command, string args, CommandParamParser[] command_param_parsers) { string pattern = @"[\w\.]+"; var rgx = new System.Text.RegularExpressions.Regex(pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase); var matches = rgx.Matches(args); var method = type.GetMethod(command, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); if (method != null) { var parameterInfos = method.GetParameters().ToArray(); var argments = (from System.Text.RegularExpressions.Match match in matches select match.Value).ToArray(); object[] retArgs = new object[parameterInfos.Count()]; for (int i = 0; i < parameterInfos.Count(); ++i) { var parser = (from cpp in command_param_parsers where cpp.Type == parameterInfos[i].ParameterType select cpp.Parser).FirstOrDefault(); if (parser != null) { try { retArgs[i] = parser.Invoke(argments[i]); } catch(SystemException e) { throw new SystemException("參數解析失敗" + e.ToString()); } } else { retArgs[i] = parameterInfos[i].DefaultValue; } } return retArgs; } return null; }
// 填入解析參數 , 命令參數皆由string 傳入 , 匹配對應的傳出值 // P.S 最少要實做 int float string public void Initialize(CommandParamParser[] parsers) { _CommandParamParsers = parsers; }