You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:49