使用CommandLineParser时,如何访问Parsed<T>的Value属性?
如何访问CommandLineParser解析结果的Value属性
嘿,我太懂你遇到的这个困惑了!CommandLineParser里的ParserResult<Options>其实是个区分联合类型,它包含两种可能的状态:解析成功的Parsed<Options>,以及解析失败的NotParsed<Options>。Value属性是Parsed<Options>这个子类特有的成员,所以直接在ParserResult<Options>实例上是看不到它的,你得先判断当前结果的类型,再提取对应的值。
推荐方法:用C#模式匹配直接判断
这是最直观简洁的方式,直接检查结果是不是成功解析的类型:
ParserResult<Options> parserResult = Parser.Default.ParseArguments<Options>(args); if (parserResult is Parsed<Options> parsedSuccess) { // 解析成功啦,直接拿Value里的Options实例 Options myOptions = parsedSuccess.Value; Console.WriteLine(myOptions.YourOptionProperty); // 换成你自己定义的选项属性就行 } else if (parserResult is NotParsed<Options> parsedFail) { // 解析失败的话,可以在这里处理错误,比如打印错误信息或者帮助文档 foreach (var error in parsedFail.Errors) { Console.WriteLine(error.ToString()); } }
更优雅的方式:用扩展方法处理
CommandLineParser还提供了现成的扩展方法,帮你省去手动类型判断的步骤,代码会更简洁:
Parser.Default.ParseArguments<Options>(args) .WithParsed(options => { // 解析成功时直接拿到Options实例,直接用就行 Console.WriteLine(options.YourOptionProperty); }) .WithNotParsed(errors => { // 解析失败时处理错误 foreach (var error in errors) { Console.WriteLine(error.ToString()); } });
为啥一开始看不到Value属性?
简单说,ParserResult<T>是个抽象基类,它本身并没有Value属性——这个属性是只有解析成功的Parsed<T>子类才有的。所以你得先确认当前结果是成功状态,才能访问到Value哦。
内容的提问来源于stack exchange,提问作者SteveC
相关产品推荐
相关产品推荐

