代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

.NET核心配置管理器在读取一个键中有冒号的字典时,会给出一个关于该值的奇怪错误消息,这是预期的吗?

  •  1
  • Lasse V. Karlsen  · 技术社区  · 6 年前

    以下程序:

    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
        }
    }
    

    但是改变现状 本章内容:

    {
        "Values": {
            "a:b": true,
            "b": false
        }
    }
    

    未处理的异常:System.InvalidOperationException异常:无法创建类型为“”的实例系统.布尔'因为它缺少公共的无参数构造函数。

       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文件不支持文件?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Nkosi    6 年前

    参考 Configuration in ASP.NET Core: Hierarchical configuration data

    将文件读入配置时,将创建唯一键以保持配置源的原始层次数据结构。使用冒号(:)将节和键展平,以保持原始结构

    这意味着 appsettings.json文件 文件

    {
        "Values": {
            "a:b": true,
            "b": false
        }
    }
    

    钥匙会被压平

    • 值:a:b

    ConfigurationBinder.BindDictionary Dictionary<string, bool> 中的属性 Options

    同时引用此 GitHub Issue