using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public static void Main()
var config = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>()
["ConnectionStringOptions:TestA:Data Source:Provider"] = "registry",
["ConnectionStringOptions:TestA:Data Source:Key"] = "hkcu:/Software/Test@Value",
["ConnectionStringOptions:TestB:Data Source"] = "source"
foreach (var connectionOptions in config.GetSection("ConnectionStringOptions").GetChildren())
var connectionString = connectionOptions.Key;
foreach (var option in connectionOptions.GetChildren())
var value = option.Value;
var sourcePath = option.Get<ExternalValue>();
Console.WriteLine($"connectionString = '{connectionString}'");
Console.WriteLine($"option = '{option.Key}'");
Console.WriteLine($"value = '{value}'");
Console.WriteLine($"sourcePath = '{sourcePath}'");
Console.WriteLine("----------------------------------");
public record class ExternalValue(string Provider, string Key);