使用CommandLine库解析C#控制台应用命令行参数报错如何解决
错误原因
- CommandLineParser库的
ParseArguments方法要求泛型参数必须为可实例化的具体类,你传入ICommandLineOption接口作为解析目标,库无法实例化接口,因此抛出找不到有效构造函数的异常。 - 多Verb场景的官方规范要求,必须将所有标记了
[Verb]特性的具体命令类都作为泛型参数传入ParseArguments,而非传入它们的公共接口。
修复方案
你可以直接调整解析逻辑,按具体命令类型匹配处理逻辑,不需要额外的类型判断、转换,也可以删除冗余的ICommandLineOption接口和WhichOption属性,修改后的完整代码如下:
[Verb("symbol", HelpText = "Symbol to test")] public class SymbolCommand { [Option('s', "symbol", Required = true, HelpText = "Symbol To run backtest")] public string Symbol { get; set; } } [Verb("begin", HelpText = "Start date of test")] public class BeginDateCommand { [Option('d', "date", Required = true, HelpText = "Date to begin run of backtest")] public System.DateTime BeginDate { get; set; } } static void Main(string[] args) { Parser.Default.ParseArguments<SymbolCommand, BeginDateCommand>(args) .WithParsed<SymbolCommand>(comm => { Console.WriteLine(comm.Symbol); }) .WithParsed<BeginDateCommand>(comm => { Console.WriteLine(comm.BeginDate); }); }
修改后可直接通过命令行调用:
- 执行Symbol命令:
你的程序名.exe symbol -s AAPL - 执行日期命令:
你的程序名.exe begin -d 2024-01-01
如果你需要保留ICommandLineOption接口做其他通用逻辑处理,只需要修改ParseArguments的泛型参数为两个具体类即可,原有接口和属性无需改动。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

