如何在C#控制台应用程序的Main方法中添加命名参数?
实现类似DISM风格的命令行参数解析(C# .NET)
这需求我太熟悉了——要做一个支持两种参数格式(/key:value 和 --key value)的C#控制台程序,还要有/help/--help的帮助提示对吧?给你两种靠谱的实现方式,按需选就行:
方案一:手写轻量解析逻辑(适合小项目)
如果你的参数不多,不想引入额外依赖,自己写解析逻辑完全够用。核心思路是遍历args数组,区分参数前缀(/或--),然后拆分键值对:
using System; using System.Collections.Generic; namespace MyApp { class Program { static void Main(string[] args) { // 存储解析后的参数键值对(忽略大小写) var parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); bool showHelp = false; for (int i = 0; i < args.Length; i++) { string arg = args[i]; // 处理帮助请求 if (arg.Equals("/help", StringComparison.OrdinalIgnoreCase) || arg.Equals("--help", StringComparison.OrdinalIgnoreCase)) { showHelp = true; break; } // 解析 /key:value 格式 else if (arg.StartsWith("/")) { var parts = arg.Substring(1).Split(new[] { ':' }, 2); if (parts.Length == 2) { parameters[parts[0].Trim()] = parts[1].Trim(); } else { Console.WriteLine($"无效参数格式: {arg}"); ShowUsage(); return; } } // 解析 --key value 格式 else if (arg.StartsWith("--")) { string key = arg.Substring(2).Trim(); // 检查下一个元素是否是参数值(不是新的参数前缀) if (i + 1 < args.Length && !args[i + 1].StartsWith("/") && !args[i + 1].StartsWith("--")) { parameters[key] = args[i + 1].Trim(); i++; // 跳过已处理的值,避免重复遍历 } else { Console.WriteLine($"缺少参数值: {arg}"); ShowUsage(); return; } } // 处理未知参数 else { Console.WriteLine($"未知参数: {arg}"); ShowUsage(); return; } } // 显示帮助或空参数场景 if (showHelp || parameters.Count == 0) { ShowUsage(); return; } // 这里可以使用解析后的参数执行业务逻辑 Console.WriteLine("解析到的参数:"); foreach (var kvp in parameters) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); } } static void ShowUsage() { Console.WriteLine("使用方式:"); Console.WriteLine(" myapp.exe /host:<host.com> /db:<db_test> /user:<username> /pass:<password>"); Console.WriteLine(" 或"); Console.WriteLine(" myapp.exe --host <host.com> --db <db_test> --user <username> --pass <password>"); Console.WriteLine(" 查看帮助: myapp.exe /help 或 myapp.exe --help"); } } }
这段代码零依赖,逻辑清晰,完美支持你要的两种参数格式,还会自动处理无效参数和帮助请求。
方案二:用成熟的NuGet包(适合复杂项目)
如果你的参数很多,或者以后可能扩展更多功能(比如必填参数验证、类型转换、短参数支持),推荐用CommandLineParser——它是.NET生态中最流行的命令行解析库之一,原生支持多种参数格式。
步骤1:安装NuGet包
在Package Manager控制台执行:
Install-Package CommandLineParser
或者在.NET CLI执行:
dotnet add package CommandLineParser
步骤2:编写代码
using System; using CommandLine; namespace MyApp { // 定义参数模型,用特性标记支持的格式和规则 public class AppOptions { // 同时支持 /host:xxx、--host xxx、-h xxx 三种格式 [Option('h', "host", Required = true, HelpText = "数据库服务器地址,格式:/host:xxx 或 --host xxx")] public string Host { get; set; } [Option('d', "db", Required = true, HelpText = "数据库名称,格式:/db:xxx 或 --db xxx")] public string Database { get; set; } [Option('u', "user", Required = true, HelpText = "数据库用户名,格式:/user:xxx 或 --user xxx")] public string Username { get; set; } [Option('p', "pass", Required = true, HelpText = "数据库密码,格式:/pass:xxx 或 --pass xxx")] public string Password { get; set; } // 自动生成帮助文档,支持 /help 和 --help [HelpOption] public string GetUsage() { return HelpText.AutoBuild(this, current => HelpText.DefaultParsingErrorsHandler(this, current)); } } class Program { static void Main(string[] args) { // 解析参数并处理结果 Parser.Default.ParseArguments<AppOptions>(args) .WithParsed(options => { // 参数解析成功,执行业务逻辑 Console.WriteLine($"连接信息:"); Console.WriteLine($"服务器: {options.Host}"); Console.WriteLine($"数据库: {options.Database}"); Console.WriteLine($"用户名: {options.Username}"); // 注意:密码不要明文输出,这里仅作示例 }) .WithNotParsed(errors => { // 参数解析失败,自动显示错误和帮助信息 foreach (var error in errors) { Console.WriteLine($"参数错误: {error.Tag}"); } }); } } }
这个方案开箱即用,自带参数验证、自动生成帮助文档,还支持短参数(比如-h代替--host),后期扩展非常方便。
内容的提问来源于stack exchange,提问作者gabtzi
相关产品推荐
相关产品推荐

