【问题标题】:When trying to call IConfiguration.Get() the result is always null尝试调用 IConfiguration.Get() 时,结果始终为 null
【发布时间】:2022-01-11 21:25:38
【问题描述】:

我在尝试使用 IConfiguration 时遇到了一个奇怪的问题。 我的代码如下:

public class testconfigtests
{
    public void DoTest()
    {            
        var testClass = new TestClass()
        {
            Name = "hello"                
        };

        var config = new Dictionary<string, string>()
        {
            { "Section1:section2",  JsonSerializer.Serialize(testClass) }
        };

        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(config)
            .Build();

        var testConfig = new GetTestClassConfig<TestClass>();
        var c = testConfig.GetTestAsync(configuration);
        // c is always null
    }
}

public class TestClass
{
    public string Name { get; set; }
}

public class GetTestClassConfig<T>
{
    public T GetTestAsync(IConfiguration configuration)
    {
        var section = configuration.GetSection("Section1:section2");
        return section.Get<T>();
    }

}

我遇到的问题是result 始终为空。我的理解是 config.Get 会返回该类的序列化版本,但它只返回 null。

【问题讨论】:

    标签: c# configuration


    【解决方案1】:

    当您使用 AddInMemoryCollection 时,它不使用任何 JSON 反序列化。 正如方法名称所暗示的,它只是一个集合。 使用时看看配置的结构是什么样子的。

    现在对比一下实际使用支持从 JSON 构建的方法时的配置结构。

    public class Program
    {
        static void Main(string[] args)
        {
            var testClass = new TestClass()
            {
                Name = "hello"          
            };
    
            var configJson = new Dictionary<string, object>()
            {
                { "Section1:section2", testClass }
            };
    
            var configurationJson = new ConfigurationBuilder()
                .AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(JsonSerializer.Serialize(configJson))))
                .Build();
    
            var testConfig = new GetTestClassConfig<TestClass>();
            var c = testConfig.GetTestAsync(configurationJson);
            
            Console.WriteLine("Result: " + c.Name);
        }
    }
    
    public class TestClass
    {
        public string Name { get; set; }
    }
    
    public class GetTestClassConfig<T>
    {
        public T GetTestAsync(IConfiguration configuration)
        {
            IConfigurationSection section = configuration.GetSection("Section1:section2");
            return section.Get<T>();
        }
    
    }
    

    正如您所见,配置结构现在实际上包含带有您的类中的字段的键。

    【讨论】:

    • 改变这个似乎没有任何区别 - 结果仍然返回为 null
    • 我编辑了代码,试试完整的代码并验证结果
    猜你喜欢
    • 2013-11-18
    • 2022-01-21
    • 1970-01-01
    • 2014-03-28
    • 2021-02-28
    • 2018-02-16
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多