Разбор аргументов командной строки с использованием библиотеки C # CommandLine

1

Я использую библиотеку CommandLine v 1.9.71.2 из nuget. К сожалению, документация не обновлена, и я не понимаю продвинутые языковые конструкции С#, используемые для этой библиотеки, поэтому я не мог придумать рабочее решение, просто просмотрев интерфейс, доступный в библиотеке.

Мой класс параметров выглядит следующим образом:

class ProgramOptions
{
    [Option('l', "spotsL", Required = true, HelpText = "Lowest stock price used for calculations.")]
    public double lowestSpot { get; set; }

    [Option('h', "spotsH", Required = true, HelpText = "Highest stock price used for calculations.")]
    public double highestSpot { get; set; }

    [Option('n', "spotsN", Required = true, HelpText = "Number of (equally distributed) stock prices [spotsL,spotsH].")]
    public int spotsNumber { get; set; }

    [OptionList('m', "maturities", ',', Required = true, HelpText = "Comma separated list of options maturities (as a fraction of a year).")]
    public IList<string> maturities { get; set; } //we want double here.

    [Option('s', "strike", Required = true, HelpText = "Strike price of options.")]
    public double strikePrice { get; set; }

    [Option('v', "vol", Required = true, HelpText = "Volatility used for calculation.")]
    public double volatility { get; set; }
}

Мне нужны только длинные имена параметров, но когда я помещаю null (как предлагает документация) вместо коротких имен, я получаю ошибки компилятора. Я также предпочел бы иметь зрелости как список удвоений (IList<double> maturities), но IDK, как этого добиться - я думаю, что с чистой CommandLine он работает только для списка string s.

Вторая часть заключается в том, что я не могу анализировать параметры из args командной строки для объекта ProgramOptions. Пробовал что-то вроде:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(args[1]);
        ///Parse Command Line
        var options = new ProgramOptions();
        bool is_succes = Parser.Default.ParseArguments(args, options);
        Console.WriteLine("parsed? {0}",is_succes);

        Console.WriteLine(options.highestSpot);
        Console.WriteLine(options.lowestSpot);
        Console.WriteLine(options.maturities.ToString());
        Console.WriteLine(options.spotsNumber);
        Console.WriteLine(options.strikePrice);
        Console.WriteLine(options.volatility);
        Console.WriteLine("program working");
    }
}

К сожалению, он не работает и дает значение False в переменной is_succes. Все остальные переменные отображают 0. Мои аргументы командной строки были Любой шанс заставить библиотеку разобрать что-то вроде:

/spotsL 10 /spotsH 1000 /spotsN 9 /maturities 1,0.5,0.001 /strike 495 /vol 0.1

и 10 действительно отображается первой WriteLine.

Теги:
parsing
command-line
command-line-parsing

1 ответ

1

Я не слишком хорошо знаком с библиотекой CommandLine, но, быстро взглянув на документацию, похоже, вам нужно использовать одиночную тире (-) для односимвольных аргументов или двойную тире (--) для многосимвольного аргументы, т.е.

--spotsL 10 --spotsH 1000 --spotsN 9 --maturities 1,0.5,0.001 --strike 495 --vol 0.1

Изменить: если вам действительно нужны входные аргументы для слэшей, вам нужно их преобразовать в тире:

public static void FormatArguments(string[] args)
{
    for (int i = 0; i < args.Length; i++)
        if (args[i].StartsWith("/"))
            args[i] = "--" + args[i].Substring(1);
}
  • 0
    Спасибо. Я упустил это. После изменения / на -- он действительно правильно анализирует входные данные, но проблема в том, что мне нужно указывать аргументы с / - это моя спецификация. Я мог бы решить эту проблему, заменив косые черты двойными черточками в строке аргументов, но это просто не кажется правильным ... Есть идеи? Библиотека, кажется, не позволяет конфигурацию проникающих символов. Конечно, все остающиеся проблемы все еще существуют, и я был бы благодарен за помощь.
  • 0
    Библиотека кажется довольно ограниченной - к сожалению, похоже, что нет способа сделать это без ручного преобразования / в -- как вы сказали. Я отредактировал свой ответ одним способом, которым вы можете сделать это. Извините, что, кажется, нет лучшего решения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню