public void Parse(string[] rawArguments, ArgumentParseOptions parseOptions = ArgumentParseOptions.None) { foreach (var arg in _args) { arg.ClearValues(); } IsValid = false; Errors = new List <string>(); IArgument[] args = _args.ToArray(); var tokens = new ArgumentTokenStream(rawArguments, parseOptions); while (tokens.Advance()) { string argumentNameToken = tokens.CurrentToken; string argumentName = argumentNameToken.TrimStart('-', '/'); IArgument matchingArgument = args.FirstOrDefault(arg => arg.ShortName == argumentName || arg.LongName == argumentName); if (matchingArgument == null) { Errors.Add(string.Format("unknown argument '{0}'", argumentName)); } else if (matchingArgument is SwitchArgument) { matchingArgument.AddValue(true); matchingArgument.IsMissing = false; } else if (tokens.Advance()) { object actualValue; if (TryGetActualValue(tokens.CurrentToken, matchingArgument, out actualValue)) { matchingArgument.AddValue(actualValue); matchingArgument.IsMissing = false; } else { Errors.Add(string.Format("invalid argument value for {0}: {1}", argumentNameToken, tokens.CurrentToken)); } } else { Errors.Add("The argument '" + argumentNameToken + "' was specified but no value was provided"); } } for (int i = 0; i < args.Length; i++) { IArgument arg = args[i]; if (arg.IsRequired && arg.IsMissing) { Errors.Add(string.Format("missing argument '{0}'", arg.LongName)); } } IsValid = Errors.Count == 0; }