使用C# CommandLine库解析命令行参数

3

我正在使用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

(在这里,删除线可以表示翻译后的修订或更正)
1个回答

4
我并不熟悉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);
}

谢谢。我忽略了这个问题。将“/”更改为“--”确实可以正确解析输入,但问题是我需要在参数前加上“/” - 这是我的规定。我知道我可以通过在参数字符串中用双破折号替换斜杠来解决这个问题,但这似乎不太对...有什么想法吗?该库似乎不允许配置前导字符。当然,所有剩余的问题仍然存在,我会感激任何帮助。 - loonatic
图书馆似乎相当有限 - 不幸的是,看起来没有办法不手动将“/”转换为“--”,就像你所说的那样。我编辑了我的答案,并提供了一种可以做到这一点的方法。很抱歉似乎没有更好的解决方案。 - AJ Richardson
是的。我想这是解决“/”问题的唯一可能方案。 有没有关于使用“null”来禁用短选项的想法? 此外,我认为对于到期日列表应该是double而不是string,我需要创建另一个对象来包含所需的列表(双精度数值),并将前者转换为后者?在这里是否有一种容易融合多态或类似的方法,还是我只需创建另一个类,重复每个属性,除了将从不同类型创建的列表? - loonatic
1
请注意,微软现在为.NET 6.0及以上版本提供了System.CommandLine。在此处查找:https://learn.microsoft.com/en-us/dotnet/standard/commandline/ - Darren Cohen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接