-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Description
Description
When binding an options type that contains a public get-only property of type IDictionary<,>, the binding is skipped and the dictionary is not populated.
Reproduction Steps
namespace ConsoleApp38
{
internal class Program
{
static void Main(string[] args)
{
IHost host = new HostBuilder()
.ConfigureAppConfiguration(builder =>
{
builder.AddInMemoryCollection(new Dictionary<string, string?>()
{
{ "DictionaryOptions:Key1", "Value1" }
});
})
.ConfigureServices((context, services) =>
{
services.Configure<TestOptions>(context.Configuration);
})
.Build();
IOptions<TestOptions> options = host.Services.GetRequiredService<IOptions<TestOptions>>();
IDictionary<string, string> dictionaryOptions = options.Value.DictionaryOptions;
Console.WriteLine("Count = {0}", dictionaryOptions.Count);
}
}
public class TestOptions
{
public IDictionary<string, string> DictionaryOptions { get; }
= new Dictionary<string, string>();
}
}Expected behavior
The dictionary property on the options instance should have one key-value pair. Console will write out "Count = 1".
Actual behavior
The dictionary property on the options instance has not key-value pairs. Console will write out "Count = 0".
Regression?
Yes, this worked in .NET 7 Preview 7, all prior previews, and all prior .NET (Core) versions.
Known Workarounds
Changing the property type to Dictionary<,> seems to work around this issue.
Configuration
Windows 11 x64 .NET SDK 7.0.100-rc.1.22431.12
Not specific to this configuration, it is failing on all OSes and all architectures in the dotnet-monitor PR builds when attempting to update to .NET 7 RC 1.
Other information
No response