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

Opublikowano: 1 września 2026

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:

System.Reflection.TargetParameterCountException: Parameter count mismatch

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:

var properties = typeof(IReadOnlyList<string>).GetProperties()
    .Where(p => p.GetIndexParameters().Length == 0);

foreach (var property in properties)
{
    var value = property.GetValue(listInstance);
    // Działa dla Count, IsReadOnly; pomija Item[Int32]
}

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.

Dodaj komentarz

Komentarze są publikowane po moderacji. Adres e-mail nie będzie widoczny publicznie.