CommandLineParser只允许使用其中一个参数

时间:2017-03-24 10:55:44

标签: c# .net command-line-parser

我正在开发一个控制台工具,它接受一些参数,然后解析为选项类。

我需要的是一个属性,用于验证 Option类中的许多标记字段中是否只有一个具有值(参数已传递)。

实施例。 我们跑的时候还可以:

my.exe -a

my.exe -b

但不是:

my.exe

my.exe -a -b

CommandLine.OptionAttribute不能做这样的事情。我做的是: 主类args []得到了扩展.Parse:

args.Parse(options)` //where options is my Options class

CommandLine.Parser.Default.ParseArguments(args, options);
var isOnlyOneOfMany = options.GetType().GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(OneOfMany)) && prop.GetValue(options) != null).Count() == 1;

如何更好地做到这一点?

2 个答案:

答案 0 :(得分:0)

我将重写您的class Options { public int OneOfManyCount { get; private set;} // This is not OneOfMany [Option('n', "name", Required = true)] public string Name { get; set; } private string _Value; [OneOfMany] [Option('v', "value", Required = true)] public string Value { get { return _Value; } set { _Value = value; OneOfManyCount++;} } private string _Date; [OneOfMany] [Option('d', "data", Required = true)] public string Data { get { return _Date; } set { _Date = value; OneOfManyCount++;} } } 班级

main

并在options.OneOfManyCount中,您可以致电 CommandLine.Parser.Default.ParseArguments(args, options); if(options.OneOfManyCount != 1) //Do something 获取参数数量

DefaultValue

请注意,如果您OneOfMany之一拥有set属性,则会再次点击OneOfManyCount,这意味着GeorgRinger\News\Domain\Model\Category将具有意外价值。

答案 1 :(得分:0)

更新:此解决方案从版本2.8.0开始不起作用,因为选项中同时不允许使用SetName和Group

您可以使用SetNameGroupName来实现此行为:

GroupName:从2.7+版开始可用

选项组代表一组可选的选项,但至少应有一个可用的选项。

SetName:从1.9+版开始可用

这意味着您可以一次运行一组命令。你不能混 一组以上的命令,否则会出错。

新的选项类:

public class Options
{
    [Option('a', "aValue", Group = "Values", SetName = "ASet")]
    public bool AValue { get; set; }

    [Option('b', "aValue", Group = "Values", SetName = "BSet")]
    public bool BValue { get; set; }
}

如何解析args:

var options = Parser.Default.ParseArguments<Options>(args);