public bool Parse(string[] args) { _parseFailed = true; int i = 0; int paramIdx = 0; while (i < args.Length) { if (args[i].StartsWith("-") || (Path.DirectorySeparatorChar != '/' && args[i].StartsWith("/"))) { string switchName = args[i].Substring(1); bool foundMatch = false; foreach (CommandLineSwitch s in _switches) { if (s.Matches(switchName)) { i = s.Process(args, i + 1); foundMatch = true; break; } } if (!foundMatch) { throw new Exception(string.Format("Unrecognized command-line switch '{0}'", args[i])); } } else if (paramIdx < _params.Count && (!_params[paramIdx].IsOptional || _params[paramIdx].Matches(args[i]))) { i = _params[paramIdx].Process(args, i); ++paramIdx; } else if (paramIdx >= _params.Count && _multiParam != null && _multiParam.Matches(args[i])) { i = _multiParam.Process(args, i); } else { return(false); } } // Check mandatory params present & all params valid. for (int j = 0; j < _params.Count; ++j) { if (!_params[j].IsValid) { return(false); } if (!_params[j].IsOptional && !_params[j].IsPresent) { return(false); } } if (_multiParam != null) { if (!_multiParam.IsValid) { return(false); } if (!_multiParam.IsOptional && !_multiParam.IsPresent) { return(false); } } _parseFailed = false; return(true); }