【问题标题】:Only one of arguments should be allowed with CommandLineParserCommandLineParser 只允许使用一个参数
【发布时间】:2017-03-24 10:55:44
【问题描述】:

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

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

例如。 运行时没问题:

我的.exe -a

我的.exe -b

但不是:

我的.exe

我的.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;

如何更好地做到这一点?

【问题讨论】:

  • CommandLine 不是 BCL 类。您使用的是哪个库?
  • “如何以更好的方式做到这一点”是什么意思? - 你觉得你目前的方法有什么问题?
  • CommandLine 是一个我可以使用的交付库。我只是想知道这是否是做这种事情的好方法,这并不夸张。
  • 什么库? @ŁukaszMioduszewski
  • var isOnlyOneOfMany = args.Length == 1;

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


【解决方案1】:

我会重写你的Options

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

并且请注意,如果您在其中一个OneOfMany 上有一个DefaultValue 属性,它会再次命中set,这意味着OneOfManyCount 将具有意想不到的价值。

【讨论】:

    【解决方案2】:

    更新:此解决方案不适用于 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; }
    }
    

    如何解析参数:

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

    【讨论】:

    • 当我尝试组合 Group 和 SetName 时,我收到此错误:“SetName 和 Group are not allowed in option”
    • 如前所述,您不能在不出现上述错误的情况下组合 Group 和 SetName。这是没有意义的,因为应该可以有一个组,这将需要一个选项,以及一个 SetName 将其限制为仅一个选项。例如,添加函数和删除函数。您应该能够要求指定一个但不能同时指定两者。该组需要一个,而 SetName 会将其限制为只有一个。
    • @UnionP 我已经更新了答案。正如您所提到的,表单版本 2.8 无法在同一 Option 中使用 GroupSetName
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多