如何为C#控制台应用实现含可选参数的自定义命令行参数
C#控制台应用实现命名参数解析并序列化JSON
直接用微软官方的System.CommandLine库就能搞定,不用手动解析args,还能轻松处理必填参数、任意组合的命名参数,步骤如下:
1. 安装依赖
在NuGet包管理器中安装两个包:
System.CommandLine:负责命令行参数解析System.Text.Json:负责JSON序列化
2. 定义参数模型类
创建一个类映射所有命令行参数,其中Name设为必填,其他参数可选:
public class AppConfig { public string Name { get; set; } = string.Empty; public string? Model { get; set; } public string? State { get; set; } public string? Version { get; set; } public int? Number { get; set; } // 补充剩下的5个参数,按需定义类型(string、int等) }
3. 配置命令行参数并处理逻辑
在Program.cs中编写核心逻辑,配置命令行选项、绑定参数到模型,最后序列化JSON:
using System.CommandLine; using System.Text.Json; // 定义根命令 var rootCommand = new RootCommand("控制台应用参数解析并生成JSON文件"); // 配置各个命令行选项 var nameOption = new Option<string>("--name", "应用名称(必填)") { IsRequired = true // 设置为必填 }; var modelOption = new Option<string?>("--model", "型号"); var stateOption = new Option<string?>("--state", "状态"); var versionOption = new Option<string?>("--version", "版本"); var numberOption = new Option<int?>("--number", "编号"); // 补充剩下的5个参数选项,格式类似上面 // 将选项添加到根命令 rootCommand.AddOption(nameOption); rootCommand.AddOption(modelOption); rootCommand.AddOption(stateOption); rootCommand.AddOption(versionOption); rootCommand.AddOption(numberOption); // 添加剩余选项 // 设置命令处理逻辑 rootCommand.SetHandler( (name, model, state, version, number) => { // 绑定参数到模型 var config = new AppConfig { Name = name, Model = model, State = state, Version = version, Number = number // 赋值剩余参数 }; // 序列化为JSON并写入文件 var json = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText("appConfig.json", json); Console.WriteLine("JSON文件已生成:appConfig.json"); }, nameOption, modelOption, stateOption, versionOption, numberOption // 传入剩余选项 ); // 运行命令行解析 await rootCommand.InvokeAsync(args);
4. 测试使用
编译后,你可以用任意参数组合运行程序:
- 仅传必填项:
myApp.exe --name "MyTestApp" - 传多个参数:
myApp.exe --name "MyTestApp" --model "ProMax" --version "2.1" --number 100 - 任意顺序传参:
myApp.exe --state "Active" --name "MyTestApp" --model "Mini"
程序会自动校验必填的--name参数,如果没传会直接报错提示,无需自己写校验逻辑。
内容的提问来源于stack exchange,提问作者Bianca Trasca
相关产品推荐
相关产品推荐

