在我的应用程序中,我使用应用程序设置来加载我的配置.我有appsettings.json:

{
  "FileReader": {
    "InputDirectory": "tmp"
  }
}

我希望 Select 用命令行参数速记switch (例如-i)覆盖值InputDirectory.我知道我可以通过一个名为FileReader__InputDirectory的环境变量来覆盖它,但是对于我的Program.cs中的SwitchMappings,我不知道什么值可以工作.以下是我的代码:

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder
            .AddJsonFile("appsettings.json", false, false)
            .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, false)
            .AddEnvironmentVariables()
            .AddCommandLine(source =>
            {
                source.Args = args;
                source.SwitchMappings = new Dictionary<string, string>()
                {
                    { "-i", "FileReader__InputDirectory" } // <-- what is the correct mapping here?
                };
            });
    })
    .ConfigureServices((context, services) =>
    {
        Console.WriteLine(context.Configuration.GetSection("FileReader")["InputDirectory"]);
        services.AddHostedService<Worker>();
    })
    .Build();

当我运行dotnet run -i ./source/json时,我希望打印输出的值是source/json(来自参数的值),但我得到的是tmp(来自appsettings.json文件的值).

如果我在不嵌套应用程序设置根级别上的属性的情况下try 这样做,它会工作得很好.

推荐答案

使用:作为分隔符:

source.SwitchMappings = new Dictionary<string, string>()
{
     { "-i", "FileReader:InputDirectory" } 
};

__是专门用于环境变量的:的替代.

请注意,您可以只通过CLI参数(see this answer)传递:

dotnet run --FileReader:InputDirectory=./source/json

另见:

Csharp相关问答推荐

如何将两个查询结果组合在C#ASP.NET MHC控制器中

无法更改或使用C#(WinForms.NET)中的全局变量

ASP.NET Core 8 Cors标题未显示

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

EF Core Fluent API中定义的多对多关系

Unity 2D自顶向下弓旋转

Int和uint相乘得到LONG?

实体框架核心中的ComplexType和OwnsOne有什么不同?

静态对象构造顺序

如何在ASP.NET Core8中启用REST应用程序的序列化?

集合表达式没有目标类型

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

在.NET 8最低API中从表单绑定中排除属性

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

EF Core:如何对关系属性进行建模?

将C#类导入到PowerShell

Visual Studio 17.8.0制表符自动完成问题--三缩进

流畅的验证--如何为属性重用规则?

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄