如何让System.CommandLine命令行实现大小写不敏感解析?
实现System.CommandLine大小写不敏感解析的方案
由于官方关于可选大小写不敏感解析的议题(#133)尚未解决,目前可以通过以下两种方式实现需求:
1. 自定义符号映射器(通用方案)
通过继承DefaultSymbolMapper并重写映射逻辑,让解析器忽略大小写匹配命令、选项和参数:
using System.CommandLine; using System.CommandLine.Parsing; public class CaseInsensitiveSymbolMapper : DefaultSymbolMapper { public override Symbol? Map(Token token, ParseResult parseResult) { var lowerToken = token.Value.ToLowerInvariant(); foreach (var symbol in parseResult.CurrentSymbols) { if (symbol is IIdentifierSymbol identifier && identifier.Name.ToLowerInvariant() == lowerToken) { return symbol; } } return base.Map(token, parseResult); } }
使用时,在创建解析器时指定自定义映射器:
var rootCommand = new RootCommand("示例命令行工具"); // 添加你的命令、选项、参数 var verboseOption = new Option<bool>("--verbose", "启用详细日志"); rootCommand.AddOption(verboseOption); var parser = new Parser(config => { config.SymbolMapper = new CaseInsensitiveSymbolMapper(); }); await parser.InvokeAsync(args);
这种方案会对所有命令行符号生效,无需逐个配置。
2. 手动添加别名(局部方案)
如果只需要针对特定选项/命令支持大小写不敏感,可以为目标符号添加所有大小写变体作为别名:
var verboseOption = new Option<bool>("--verbose", "启用详细日志") { Aliases = { "--VERBOSE", "--Verbose", "--vErBoSe" } }; rootCommand.AddOption(verboseOption);
此方法适合少量符号的场景,但需要手动维护所有可能的大小写组合,扩展性较差。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

