2

我正在开发一个控制台工具,它接受一些参数,然后解析为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;

如何更好地做到这一点?

4

2 回答 2

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

请注意,如果你有一个DefaultValue属性OneOfMany,它会再次击中set一次,这意味着OneOfManyCount会有意想不到的价值。

于 2017-03-24T11:31:52.873 回答
0

更新:此解决方案不适用于 2.8.0 版本,因为选项中不允许 SetName 和 Group

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

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);
于 2020-02-17T10:00:37.710 回答