Здравствуйте, Passerby, Вы писали:
K>>У меня там вызывается Generic-метод:
K>>K>>public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, [StringSyntax(StringSyntaxAttribute.Uri)] string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
K>>
P>По вашей ссылке https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions?view=net-8.0 перечислены следующие методы:
P>PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)
P>PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonSerializerOptions, CancellationToken)
P>PostAsJsonAsync<TValue>(HttpClient, String, TValue, JsonTypeInfo<TValue>, CancellationToken)
P>PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, CancellationToken)
P>PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonSerializerOptions, CancellationToken)
P>PostAsJsonAsync<TValue>(HttpClient, Uri, TValue, JsonTypeInfo<TValue>, CancellationToken)
P>1. Где ваш Generic-метод?
Выделен болдом.
P>2. Почему нет в первом параметре this HttpClient client?
Потому, что перед первым параметром в сигнатуре стоит ключевое слово
this. Это делает его екстеншн-методом, то есть его можно вызывать так, как будто бы он был экземплярным методом, объявленным внутри типа первого аргумента.
P>3. Почему стоит атрибут [StringSyntax(StringSyntaxAttribute.Uri)]?
Потому, что он есть в метаданных метода.
P>4. В перечисленных методах не указаны умолчания JsonSerializerOptions? options = null, CancellationToken cancellationToken = default. Как догадались, что они есть?
Из подсказок в IDE.
P>5. Ни в этих методах, ни в вашем Generic-методе в параметрах нет объекта var filter = new Filter(84683, 50, 4194303);
Зато есть TValue, который является параметром генерика. Это сигнал для компилятора "попробуй вывести значение типа-аргумента по значениям параметров". В общем случае компилятор строит некоторую систему уравнений на типы и ищет её решение. В данном случае система уравнений очень простая, вида "TValue == Filter". И результат работы — такой же, как если бы пользователь вручную написал
client.PostAsJsonAsync<Filter>(@"https://smi2.ru/newdata/jsapi?action=articles", filter)