ConfigurationBinder tiše přeskočí neplatné prvky pole.

Počínaje rozhraním .NET 8 bezobslužně přeskočí prvky pole a seznamu, ConfigurationBinder jejichž hodnoty nelze převést na cílový typ. Dříve byly neúspěšné prvky zachovány jako null zástupné symboly a výsledná kolekce zachovala délku odpovídající počtu prvků konfiguračního zdroje.

Verze byla představena

.NET 8

Předchozí chování

Dříve, při připojování pole nebo vlastnosti seznamu prostřednictvím Get<T>(IConfiguration) nebo Bind(IConfiguration, Object), pokud nebylo možné hodnotu prvku převést na cílový typ, zůstal tento prvek ve výsledku jako zástupný symbol null. Délka kolekce odpovídala počtu prvků v konfiguraci.

// 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)

Nové chování

Počínaje rozhraním .NET 8 jsou prvky, u kterých dojde k selhání při převodu typu, tiše vynechány. Výsledná kolekce obsahuje pouze úspěšně vázané prvky a má kratší délku než počet položek ve zdroji konfigurace.

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

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

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Interní implementace ConfigurationBinder byla refaktorována v .NET 8. Místo předběžného přidělení cílového pole a vazebních prvků (které zůstaly null při selhání převodu), binder nyní shromažďuje pouze úspěšně vázané prvky do dočasného seznamu před materializací konečného pole.

Předchozí chování bylo také problematické pro typy hodnot, jako je int[]. Pro neplatnou hodnotu konfigurace by vazebník uložil 0, která byla nerozlišitelná od legitimní hodnoty 0. Nové chování zabraňuje této nejednoznačnosti.

  • Zapněte ErrorOnUnknownConfiguration během vývoje, abyste okamžitě odhalili neplatné konfigurační hodnoty místo tichého odstranění prvků:

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

    Počínaje rozhraním .NET 8 tato možnost také způsobí, že ConfigurationBinder vyvolá InvalidOperationException pokud se hodnota nedá převést na cílový typ. Další informace naleznete v tématu ConfigurationBinder vyvolá chybu při nesouladu hodnoty.

  • Oprava neplatných hodnot konfigurace Ujistěte se, že všechny hodnoty ve zdroji konfigurace odpovídají očekávaným typům vázaného modelu.

  • Ověřte délky kolekce po vazbě , pokud váš kód závisí na počtu prvků odpovídajících zdroji konfigurace.

  • Pokud potřebujete řádně zpracovat nekonvertovatelné hodnoty a zachovat všechny položky pole, použijte vlastnosti řetězce s ruční analýzou.

Ovlivněná rozhraní API