ConfigurationBinder hoppar tyst över ogiltiga matriselement

Från och med .NET 8 hoppar ConfigurationBinder tyst över matris- och listelement vars värden inte kan konverteras till måltypen. Tidigare bevarades misslyckade element som null platshållare och den resulterande samlingen behöll samma längd som antalet element i konfigurationskällan.

Version lanserad

.NET 8

Tidigare beteende

Tidigare, när en matris eller listegenskap binds via Get<T>(IConfiguration) eller Bind(IConfiguration, Object), om ett elements värde inte kunde konverteras till måltypen, bevarades elementet som platshållare null i resultatet. Samlingslängden matchade antalet element i konfigurationen.

// Configuration source, for example, appsettings.json:
// "Items": [
//   { "Name": "A", "Interval": 10 },
//   { "Name": "B", "Interval": "a" }   <-- invalid int
// ]

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null   (conversion failed, placeholder preserved)

Nytt beteende

Från och med .NET 8 ignoreras element som misslyckas med typkonvertering tyst. Den resulterande samlingen innehåller endast bundna element och har en kortare längd än antalet poster i konfigurationskällan.

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }

Typ av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

Den interna implementeringen av ConfigurationBinder omstrukturerades i .NET 8. I stället för att förallokera målmatrisen och binda element på plats (som lämnades null vid konverteringsfel) samlar bindningen nu endast de element som bundits framgångsrikt i en tillfällig lista innan den slutliga matrisen materialiseras.

Det tidigare beteendet var också problematiskt för värdetyper som int[]. För ett ogiltigt konfigurationsvärde skulle bindaren lagra 0, som var omöjlig att skilja från ett legitimt värde för 0. Det nya beteendet undviker den här tvetydigheten.

  • Aktivera ErrorOnUnknownConfiguration under utvecklingen för att visa ogiltiga konfigurationsvärden omedelbart i stället för att tyst släppa element:

    var settings = configuration.GetSection("Items").Get<MyItem[]>(options =>
        options.ErrorOnUnknownConfiguration = true);
    

    Från och med .NET 8 leder ConfigurationBinder det här alternativet också till att utlösa ett InvalidOperationException när ett värde inte kan konverteras till måltypen. Mer information finns i ConfigurationBinder kastar för icke matchande värden.

  • Åtgärda ogiltiga konfigurationsvärden. Se till att alla värden i konfigurationskällan matchar de förväntade typerna för den bundna modellen.

  • Verifiera samlingslängder efter bindning om koden är beroende av antalet element som matchar konfigurationskällan.

  • Använd strängegenskaper med manuell parsning om du behöver hantera okonverterbara värden på ett smidigt sätt och bevara alla matrisposter.

Berörda API:er