Skip to content

Configuration-binding source generator doesn't bind Dictionary<string, Enum?> #115343

@sbomer

Description

@sbomer

Repro:

using System.Text.Json.Serialization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

var builder = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        { "MySettings:Dictionary:Key1", "Value1" },
    });
var configuration = builder.Build();

var services = new ServiceCollection();
services.Configure<MySettings>(configuration.GetSection("MySettings"));

var serviceProvider = services.BuildServiceProvider();
var settings = serviceProvider.GetRequiredService<IOptions<MySettings>>().Value;

Console.WriteLine($"{string.Join(", ", settings.Dictionary.Select(kvp => $"{kvp.Key}: {kvp.Value}"))}");

public class MySettings
{
    public Dictionary<string, MyValue?> Dictionary { get; set; } = new ();
}

public enum MyValue
{
    Value1,
    Value2,
    Value3
}

Using reflection-based binding this prints Key1: Value1.
With <EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator> it doesn't print anything, and I see this in the generated sources:

        public static void BindCore(IConfiguration configuration, ref global::System.Collections.Generic.Dictionary<string, global::MyValue?> instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            foreach (IConfigurationSection section in configuration.GetChildren())
            {
            }
        }

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions