コード例 #1
0
        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);
        }