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