【问题标题】:Parsing command line arguments using C# CommandLine library使用 C# CommandLine 库解析命令行参数
【发布时间】:2015-01-06 05:01:15
【问题描述】:

我正在使用来自 nuget 的命令行库 v 1.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's(如文档所示)代替短名称时,会出现编译器错误。我也更希望将成熟度作为双打列表 (IList&lt;double&gt; maturities),但 IDK 如何实现这一点 - 我认为使用纯命令行它仅适用于 strings 列表。

第二部分是我无法将命令行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_succes 变量中给出False。所有其他变量显示0 我的命令行参数是任何机会让库解析类似:

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

10确实是由te先显示的WriteLine

【问题讨论】:

    标签: c# .net parsing command-line command-line-arguments


    【解决方案1】:

    我对 CommandLine 库不太熟悉,但快速浏览一下 documentation,看来您需要对单字符参数使用单破折号 (-) 或双破折号 ( --) 用于多字符参数,即

    --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);
    }
    

    【讨论】:

    • 谢谢。我忽略了这一点。将/ 更改为-- 后,它确实正确解析了输入,但问题是我需要使用/ 处理参数——这是我的规范。 IK 我可以通过在参数字符串中用双破折号替换斜杠来解决这个问题,但它似乎不正确......有什么想法吗?该库似乎不允许进行字符配置。当然,所有剩余的问题仍然存在,我将不胜感激。
    • 图书馆似乎相当有限 - 不幸的是,如果不手动将/ 转换为--,就像你说的那样,似乎没有办法做到这一点。我用一种可以做到的方式编辑了我的答案。抱歉,似乎没有更好的解决方案。
    • 是的。我猜这是/ 问题的唯一可能解决方案。关于 nulls 禁用短选项的任何想法?另外我猜想对于到期列表是doubles,而不是strings,我需要创建另一个包含所需列表(双打)的对象并将前者转换为后者?有什么简单的方法可以在这里合并多态性或类似的东西,还是我应该简单地创建另一个类来重复每个属性,除了将由不同类型创建的列表之外?
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多