У меня есть несколько таких предикатов, каждый из которых проверяет свой код состояния 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

0
Ahmad 24 Июн 2020 в 05:59

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);
1
Iliar Turdushev 24 Июн 2020 в 08:32