如何创建一个需要多个值的选项开关?

时间:2016-02-15 07:22:41

标签: c# parsing

我使用了option属性,它从命令行获取值并将其传递给Options类的对象。 考虑一下我是否通过:-j 23 然后它会将23设置为JournalId属性。但我想在我的代码中进行更改,如果我通过:-j 23 2016 5作为值 那么它必须相应地分配23到JournalId,2016年到年份和5到IssueId。 那么,我必须在代码中做出哪些改变才能使其成为可能

class Options
{

    [Option('j',"journalid", Required = true,
      HelpText = "journal Id.")]
    public int JournalId { get; set; }


    [Option("year", DefaultValue = 0,
      HelpText = "Publication year")]
    public int Year { get; set; }

    [Option("issueId", DefaultValue = 0,
      HelpText = "Publication IssueId")]
    public int IssueId { get; set; }

    [ParserState]
    public IParserState LastParserState { get; set; }

    [HelpOption('h')]
    public string GetUsage() 
    {
        return HelpText.AutoBuild(this,
          (HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
    }
}

// Consume them
static void Main(string[] args)
{
    var options = new Options();


    if (CommandLine.Parser.Default.ParseArguments(args, options))
    {
        // Values are available here
        if (true) Console.WriteLine("JournalId: {0} {1} {2}", options.JournalId,options.Year,options.IssueId);
    }

    Console.ReadKey();
}

1 个答案:

答案 0 :(得分:0)

您似乎需要在如何初始化Options对象方面有一些灵活性。通过使用属性对它们进行初始化,您将被限制为修改Options类本身以更改其初始化方式。您可能需要考虑使用经典creational patterns之一,而不是使用属性,而不是使用属性。

例如,您的工厂类将使用命令行参数并解析它们。它将有一个公共方法,它构造一个Options对象并根据命令行解析的结果对其进行初始化。

当您需要修改解析命令行的方式时,您可以修改工厂类或使用相同的接口编写新的工厂类。