ConfigurationBinder bez ostrzeżenia pomija nieprawidłowe elementy tablicy

Począwszy od platformy .NET 8, ConfigurationBinder milcząco pomija elementy tablicy i listy, których wartości nie można przekonwertować na docelowy typ. Wcześniej elementy, które zakończyły się niepowodzeniem, zostały zachowane jako null symbole zastępcze, a wynikowa kolekcja zachowała taką samą długość jak liczba elementów w źródle konfiguracji.

Wersja wprowadzona

.NET 8

Poprzednie zachowanie

Wcześniej, podczas wiązania tablicy lub właściwości listy za pomocą Get<T>(IConfiguration) lub Bind(IConfiguration, Object), jeśli wartość elementu nie mogła zostać przekonwertowana na typ docelowy, element ten został zachowany jako symbol zastępczy null w wyniku. Długość kolekcji odpowiadała liczbie elementów w konfiguracji.

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

Nowe zachowanie

Począwszy od platformy .NET 8, elementy, które nie przechodzą konwersji typów, są pomijane bez powiadomienia. Wynikowa kolekcja zawiera tylko pomyślnie powiązane elementy i ma krótszą długość niż liczba wpisów w źródle konfiguracji.

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

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

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Wewnętrzna implementacja ConfigurationBinder została refaktoryzowana na platformie .NET 8. Zamiast wstępnie przydzielać tablicę docelową i elementy powiązania w miejscu (które pozostały null po niepowodzeniu konwersji), powiązanie zbiera teraz tylko pomyślnie powiązane elementy do listy tymczasowej przed materializacją ostatecznej tablicy.

Poprzednie zachowanie było również problematyczne dla typów wartości, takich jak int[]. W przypadku nieprawidłowej wartości konfiguracji binder będzie przechowywać 0, co było nie do odróżnienia od wartości prawidłowej 0. Nowe zachowanie pozwala uniknąć tej niejednoznaczności.

  • Włącz ErrorOnUnknownConfiguration podczas programowania , aby natychmiast wyświetlić nieprawidłowe wartości konfiguracji, a nie dyskretnie upuszczać elementy:

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

    Począwszy od platformy .NET 8, ta opcja również powoduje ConfigurationBinder zgłoszenie InvalidOperationException gdy nie można przekonwertować wartości na docelowy typ. Aby uzyskać więcej informacji, zobacz ConfigurationBinder zgłasza błędną wartość.

  • Napraw nieprawidłowe wartości konfiguracji. Upewnij się, że wszystkie wartości w źródle konfiguracji są zgodne z oczekiwanym typem dla powiązanego modelu.

  • Zweryfikuj długość kolekcji po powiązaniu, jeśli kod zależy od liczby elementów pasujących do źródła konfiguracji.

  • Użyj właściwości ciągu z ręcznym analizowaniem , jeśli chcesz bezpiecznie obsługiwać niekonwertowalne wartości i zachować wszystkie wpisy tablicy.

Interfejsy API, których dotyczy problem