如何实现两个Option参数之间的二选一强制传递规则
方案1:使用框架原生SetName参数(推荐)
CommandLineParser 原生支持通过SetName定义互斥的参数集合,不需要额外写校验逻辑,配置完框架会自动校验规则:
- 给
j和f两个Option分别设置不同的SetName,二者的Required保持true - 公共参数
t不需要设置SetName,全局生效
修改后的Options类代码如下:
[Option('j', "jsonfile", Required = true, HelpText = "Path to json file", SetName = "FileMode")] public string JsonFilePath { get; set; } [Option('f', "jsonfolder", Required = true, HelpText = "Path to json directory", SetName = "FolderMode")] public string JsonFolder { get; set; } [Option('t', "targetpath", Required = true, HelpText = "Target folder")] public string TargetFolder { get; set; }
配置完成后,如果同时不传j和f、或者同时传j和f,框架都会直接返回参数解析错误,符合你的需求。
方案2:自定义校验逻辑
如果你不想用SetName,也可以在参数解析完成后自己加校验规则:
- 先把j和f的
Required属性改为false
[Option('j', "jsonfile", Required = false, HelpText = "Path to json file")] public string JsonFilePath { get; set; } [Option('f', "jsonfolder", Required = false, HelpText = "Path to json directory")] public string JsonFolder { get; set; } [Option('t', "targetpath", Required = true, HelpText = "Target folder")] public string TargetFolder { get; set; }
- 在参数解析成功的回调中添加校验逻辑:
Parser.Default.ParseArguments<Options>(args) .WithParsed(opt => { bool hasJsonFile = !string.IsNullOrWhiteSpace(opt.JsonFilePath); bool hasJsonFolder = !string.IsNullOrWhiteSpace(opt.JsonFolder); // 校验二选一必填 if (!hasJsonFile && !hasJsonFolder) { Console.WriteLine("参数错误:必须传入 -j/--jsonfile 或 -f/--jsonfolder 中的一个"); Environment.Exit(1); } // 如需限制两个参数不能同时传入,添加下面的逻辑 // if (hasJsonFile && hasJsonFolder) // { // Console.WriteLine("参数错误:-j/--jsonfile 和 -f/--jsonfolder 不能同时传入"); // Environment.Exit(1); // } // 后续业务逻辑 }) .WithNotParsed(errs => { // 原有解析错误处理逻辑 });
内容的提问来源于stack exchange,提问作者Saddam Hussain I H
相关产品推荐
相关产品推荐

