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:
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:
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.