Closed
Description
I've tried to use the new configuration binder source generator to bind a type that contains a custom collection of abstract types.
I got following error:
C:\Users\adsitnik\source\repos\ConfigBindRepro\Microsoft.Extensions.Configuration.Binder.SourceGeneration\Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator\BindingExtensions.g.cs(61,29): error CS0
103: The name 'InitializeEndPoint' does not exist in the current context [C:\Users\adsitnik\source\repos\ConfigBindRepro\ConfigBindRepro.csproj]
I would expect it to not produce a compiler error and just try to map what it can, without throwing an exception at runtime (this is what the reflection based binder does in this case).
Repro:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="dotnet8" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json" />
</packageSources>
</configuration>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>
<Features>InterceptorsPreview</Features>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0-rc.2.23429.20" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0-rc.2.23429.20" />
</ItemGroup>
</Project>
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System.Collections.ObjectModel;
using System.Net;
namespace ConfigBindRepro
{
internal class Program
{
static void Main()
{
HostApplicationBuilder builder = Host.CreateEmptyApplicationBuilder(settings: null);
builder.Configuration.AddInMemoryCollection(new KeyValuePair<string, string?>[]
{
new KeyValuePair<string, string?>("ConfigBindRepro:EndPoints:0", "localhost"),
new KeyValuePair<string, string?>("ConfigBindRepro:Property", "true")
});
AClass instance = new();
#pragma warning disable SYSLIB1100
#pragma warning disable SYSLIB1101
builder.Configuration.GetSection("ConfigBindRepro").Bind(instance);
#pragma warning restore
BindToConfiguration(instance, builder.Configuration);
if (instance.Property && instance.EndPoints.Any())
{
Console.WriteLine("OK");
}
}
private static void BindToConfiguration(AClass settings, IConfiguration configuration)
{
var endpointsConfig = configuration.GetSection("ConfigBindRepro:EndPoints");
foreach (var endpoint in endpointsConfig.GetChildren())
{
if (endpoint.Value is string)
{
settings.EndPoints.Add(endpoint.Value);
}
}
}
}
public class AClass
{
public EndPointCollection EndPoints { get; init; } = new EndPointCollection();
public bool Property { get; set; } = false;
}
public sealed class EndPointCollection : Collection<EndPoint>, IEnumerable<EndPoint>
{
public EndPointCollection() { }
public void Add(string hostAndPort)
{
EndPoint? endpoint;
if (IPAddress.TryParse(hostAndPort, out IPAddress? address))
{
endpoint = new IPEndPoint(address, 0);
}
else
{
endpoint = new DnsEndPoint(hostAndPort, 0);
}
Add(endpoint);
}
}
}
.NET SDK:
Version: 8.0.100-rc.2.23429.6
Commit: 4bafa2271a