我正在使用Nuget上的CommandLine库v1.9.71.2。不幸的是,文档已经过时,而我不理解此库中使用的高级C#语言结构,因此仅凭库中可用的界面无法提出可行的解决方案。
我的选项类如下:
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
),但我不知道如何实现 - 我认为使用纯CommandLine仅适用于string
类型的列表。
第二部分是我无法将命令行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");
}
}
不幸的是它并不起作用,并在
is_success
变量中返回False
。所有其他变量显示0
。我的命令行参数是有没有机会让库解析像这样的内容:
/spotsL 10 /spotsH 1000 /spotsN 9 /maturities 1,0.5,0.001 /strike 495 /vol 0.1
第一个WriteLine
确实显示了10
。
double
而不是string
,我需要创建另一个对象来包含所需的列表(双精度数值),并将前者转换为后者?在这里是否有一种容易融合多态或类似的方法,还是我只需创建另一个类,重复每个属性,除了将从不同类型创建的列表? - loonatic