public CommandLineParseResult Parse(string[] args)
        {
            CommandLineParseResult result = new CommandLineParseResult(args);

            for (int position = 0; position < args.Length; position++)
            {
                string givenArg = args[position];

                bool validArgFound = false;


                if (string.IsNullOrEmpty(givenArg))
                {
                    // 选项不能为空
                    result.ParseErrors.Add(string.Format(Error.FailedToParseArgument, position));
                    continue;
                }

                if (givenArg.Length < 2)
                {
                    // 选项长度至少为2, 第一个为'-','/','--',第2个为选项名
                    result.ParseErrors.Add(string.Format(Error.ArgumentsMustHaveMinimumLength, givenArg, position));
                    continue;
                }

                bool hasArgumentPrefix = givenArg.StartsWith(LongCommandPrefix) || givenArg.StartsWith(SlashCommandPrefix) || givenArg.StartsWith(HyphenCommandPrefix);
                if (!hasArgumentPrefix)
                {
                    result.ParseErrors.Add(string.Format(Error.ArgumentsMustHavePrefix, givenArg, position, SlashCommandPrefix, HyphenCommandPrefix, LongCommandPrefix));
                    continue;
                }

                // 是不是以'--'开头
                bool isLong = givenArg.StartsWith(LongCommandPrefix);
                // 去除'-','/','--'开头
                string shrinkedArg = isLong ?   givenArg.Substring(2) : givenArg.Substring(1);

                // 用':'分隔选项
                string[] splittedArgs = shrinkedArg.Split(_TextToValueDividerCharArray, 2, StringSplitOptions.None);
                System.Diagnostics.Trace.Assert(splittedArgs.Length <= 2);
                System.Diagnostics.Trace.Assert(splittedArgs.Length > 0);
                string argumentKey   = splittedArgs[0];
                string argumentValue = splittedArgs.Length > 1 ? splittedArgs[1] : string.Empty;

                foreach (CommandLineArgument validArg in Arguments)
                {
                    // 依次匹配预定义的选项
                    CommandLineArgument parsedArg;
                    if (TryMatch(validArg, argumentKey, argumentValue, position, isLong, out parsedArg))
                    {
                        validArgFound = true;
                        // 匹配成功,验证它是不是只能是唯一的
                        if (parsedArg.OnlyOnce && result.HasArgument(parsedArg.Id))
                        {
                            // 已经存在了,且该选项限制只能有一个,所以出错了
                            CommandLineArgument existingArg = result.GetArgument(parsedArg.Id);
                            result.ParseErrors.Add(string.Format(Error.IgnoringArgument, givenArg, position, existingArg.Position));
                        }
                        else
                        {
                            result.AddArgument(parsedArg);
                        }
                        break;
                    }
                }

                if (!validArgFound)
                {
                    // 没有找到匹配的参数
                    result.ParseErrors.Add(string.Format(Error.DoNotMatchAnyArgument, givenArg, position));
                }
            }
            return(result);
        }
        public bool TryMatch(CommandLineArgument arg, string key, string value, int position, bool isLong, out CommandLineArgument parsedArg)
        {
            bool matches = isLong ? key == arg.LongText : key == arg.Text;

            if (matches)
            {
                parsedArg = CommandLineArgument.CreateFromInstance(arg, value, position);
                return(true);
            }
            parsedArg = null;
            return(false);
        }