Я использую библиотеку 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
.
Я не слишком хорошо знаком с библиотекой 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);
}
/
на--
он действительно правильно анализирует входные данные, но проблема в том, что мне нужно указывать аргументы с/
- это моя спецификация. Я мог бы решить эту проблему, заменив косые черты двойными черточками в строке аргументов, но это просто не кажется правильным ... Есть идеи? Библиотека, кажется, не позволяет конфигурацию проникающих символов. Конечно, все остающиеся проблемы все еще существуют, и я был бы благодарен за помощь./
в--
как вы сказали. Я отредактировал свой ответ одним способом, которым вы можете сделать это. Извините, что, кажется, нет лучшего решения.