У меня есть несколько таких предикатов, каждый из которых проверяет свой код состояния http:
readonly Predicate<HttpResponseData> createdHttpStatusPredicate = (HttpResponseData responseData) => {
return responseData.StatusCode == HttpStatusCode.Created;
};
readonly Predicate<HttpResponseData> okHttpStatusPredicate = (HttpResponseData responseData) => {
return responseData.StatusCode == HttpStatusCode.OK;
};
...
Я передаю их в следующий метод, подобный этому (код был немного упрощен, чтобы вырезать нерелевантные детали):
public static async Task<HttpResponseData> HttpCaller(HttpMethod requestMethod, Predicate<HttpResponseData> predicate)
{
HttpResponseData response = await SendHttpRequest(requestMethod);
if (predicate(response) == true)
return response;
else
return null;
}
Вот пример вызова, отправляющего один предикат в указанный выше метод:
HttpResponseData data = await HttpRequestUtils.HttpCaller(HttpMethod.Post, createdHttpStatusPredicate);
Мне интересно, могу ли я объединить все предикаты в какой-нибудь общий предикат или, возможно, как-то указать статус http, который нужно искать в предикате, когда я вызываю HttpCaller
?
Да, я знаю, что приведенный выше пример не имеет особого смысла, поскольку я могу просто передать HTTP-статус, который я ищу, в HttpCaller
напрямую, не используя предикат, но в моем случае HttpCaller
может получить мои сложные предикаты тоже в качестве входных данных, в зависимости от того, откуда вызывается HttpCaller
1 ответ
Следующие два подхода можно использовать, чтобы избавиться от всех предикатов, которые проверяют только HttpStatusCode
.
1. Создайте метод, который создает Predicate
для данного HttpStatusCode
:
public static Predicate<HttpResponseData> CreatePredicateByHttpStatusCode(HttpStatusCode status)
{
return r => r.StatusCode == status;
}
А затем используйте этот метод, когда вам нужен Predicate
, который проверяет только заданное HttpStatusCode
:
var result = await HttpCaller(httpMethod, CreatePredicateByHttpStatusCode(HttpStatusCode.OK));
2. Создайте перегрузку метода HttpCaller
, который принимает HttpStatusCode
и проверяет только заданное HttpStatusCode
:
// This is your current method. It accepts a common Predicate that is used
// to check for complex conditions.
public static async Task<HttpResponseData> HttpCaller(HttpMethod requestMethod, Predicate<HttpResponseData> predicate)
{
HttpResponseData response = await SendHttpRequest(requestMethod);
if (predicate(response) == true)
return response;
else
return null;
}
// This is a new Method. It accepts HttpStatusCode instead of the Predicate.
// It can be used for checking only for HttpStatusCode.
public static async Task<HttpResponseData> HttpCaller(HttpMethod requestMethod, HttpStatusCode status)
{
// Here your original method HttpCaller is used.
return await HttpCaller(requestMethod, r => r.StatusCode == status);
}
Перегруженная форма HttpCaller
может использоваться, когда вам нужно проверить только HttpStatusCode
:
var result = await HttpCaller(httpMethod, HttpStatusCode.OK);
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.