我正在开发一个控制台工具,它接受一些参数,然后解析为选项类。
我需要的是一个属性,用于验证 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;
如何更好地做到这一点?
答案 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
您可以使用SetName
和GroupName
来实现此行为:
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);