Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
 // 填入解析參數 , 命令參數皆由string 傳入 , 匹配對應的傳出值
 // P.S 最少要實做 int float string
 public void Initialize(CommandParamParser[] parsers)
 {
     _CommandParamParsers = parsers;
 }