我使用了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();
}
答案 0 :(得分:0)
您似乎需要在如何初始化Options对象方面有一些灵活性。通过使用属性对它们进行初始化,您将被限制为修改Options类本身以更改其初始化方式。您可能需要考虑使用经典creational patterns之一,而不是使用属性,而不是使用属性。
例如,您的工厂类将使用命令行参数并解析它们。它将有一个公共方法,它构造一个Options对象并根据命令行解析的结果对其进行初始化。
当您需要修改解析命令行的方式时,您可以修改工厂类或使用相同的接口编写新的工厂类。