c# - .NET Core 配置管理器,读取一个字典,其中一个键里面有一个冒号,给出一个关于值的奇怪错误消息,这是预期的吗?
问题描述
以下程序:
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
namespace ConsoleApp3
{
class Program
{
static void Main()
{
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
var configuration = builder.Build();
var options = configuration.Get<Options>();
foreach (var kvp in options.Values)
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
}
internal class Options
{
public Dictionary<string, bool> Values { get; } = new Dictionary<string, bool>();
}
}
当给定这个appsettings.json
文件时,运行完美:
{
"Values": {
"a": true,
"b": false
}
}
但将appsettings.json
内容更改为:
{
"Values": {
"a:b": true,
"b": false
}
}
我得到了这个例外:
未处理的异常:System.InvalidOperationException:无法创建“System.Boolean”类型的实例,因为它缺少公共无参数构造函数。
堆栈跟踪:
at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindDictionary(Object dictionary, Type dictionaryType, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindProperty(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindNonScalar(IConfiguration configuration, Object instance, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.Get[T](IConfiguration configuration, Action`1 configureOptions)
at ConsoleApp3.Program.Main() in D:\Dev\ConsoleApp3\ConsoleApp3\Program.cs:line 15
我究竟做错了什么?请注意,密钥中有一个冒号是完全合法的 json,但可能不支持在 appsettings.json 文件中存储任何奇怪的字典?
解决方案
ASP.NET Core 中的参考配置:分层配置数据
配置 API 能够通过在配置键中使用分隔符来展平分层数据,从而维护分层配置数据。
将文件读入配置时,会创建唯一键以维护配置源的原始分层数据结构。部分和键使用冒号 (:) 展平以保持原始结构
这意味着在以下appsettings.json文件中
{
"Values": {
"a:b": true,
"b": false
}
}
键将被展平为
- 值:a:b
- 值:b
ConfigurationBinder.BindDictionary
当尝试绑定Dictionary<string, bool>
属性时,这将破坏设置文件的结构Options
还引用了这个GitHub 问题
冒号保留用于键中的特殊含义,因此不应将它们用作正常键值的一部分。
推荐阅读
- powershell - 使用 Powershell 输出 2 列 csv 文件
- stream - 当它是广播流时如何防止丢弃事件?
- alexa - Amazon Echo (Alexa) 可以识别自定义品牌吗?
- javascript - 解析维基百科数学
- node.js - 无法在 docker 机器上安装 npm 模块
- javascript - 如何使用 Javascript 使用 URL 参数填充嵌入式网站表单?
- javascript - 在函数中使用超级
- elasticsearch - 从 Elastic 2 迁移到 5
- excel - VBA-将列附加到其他工作表列
- android - 对 BroadcastReceiver 的质疑