Debugowanie TargetParameterCountException w .NET: ukryty indeksator w IReadOnlyList<T>

Problem

Piszesz serializator lub walidator oparty na refleksji, który wylicza właściwości interfejsu. Wywołujesz PropertyInfo.GetValue(instance) na każdej właściwości i nagle dostajesz:

unknown node

Komunikat nie daje żadnej wskazówki, że przyczyną jest indeksator. Sprawdzasz wywołującego, serializator, dostawcę — ale prawdziwym winowajcą jest ukryty indeksator w IReadOnlyList<T>.

Pierwsza przyczyna

Interfejs IReadOnlyList<T> udostępnia właściwość indeksatora o nazwie Item[Int32]. Gdy wywołasz jednoargumentowe przeciążenie PropertyInfo.GetValue(Object) na właściwości indeksowanej, rzuca TargetParameterCountException, ponieważ indeksator wymaga dodatkowego parametru (indeksu). Właściwości nieindeksowane, takie jak Count i IsReadOnly działają poprawnie z jednoargumentowym przeciążeniem.

Rozwiązanie

Odfiltruj właściwości indeksowane przed wywołaniem GetValue:

unknown node

PropertyInfo.GetIndexParameters zwraca pustą tablicę dla właściwości nieindeksowanych, więc sprawdzenie Length > 0 niezawodnie identyfikuje indeksatory.

Weryfikacja

Ta poprawka została zweryfikowana w produkcyjnym pipeline: etap build-claims w Blog Steward, który wcześniej kończył się niepowodzeniem pięć razy z rzędu na tym wyjątku, przeszedł za pierwszym podejściem po commicie 1730b72. Deterministyczna reprodukcja potwierdza, że filtrowanie z GetIndexParameters().Length > 0 całkowicie eliminuje wyjątek.

Najważniejsza myśl

Zawsze odfiltruj właściwości indeksowane z każdego przejścia refleksji przed wywołaniem PropertyInfo.GetValue z jednym argumentem. Metoda GetIndexParameters() to niezawodny detektor — zwraca pustą tablicę dla właściwości nieindeksowanych i niepustą dla indeksatorów.

Komentarze (0)

Brak komentarzy.

Komentarze są chwilowo wyłączone. Wrócą wkrótce.