Компенсация отсутствия параметров "out" в асинхронных методах.

У меня есть класс, который обрабатывает все транзакции API в приложении, над которым я работаю. Общая схема его методов выглядит следующим образом:

public static async Task<bool> APICall(int bla)
        {
            HttpResponseMessage response;
            bool res;

            // Post/GetAsync to server depending on call + other logic
            return res;
        }

То, что я хочу сделать, - это также возможность вернуть response.StatusCode вызывающему, но поскольку нам не разрешено использовать параметры "out" с асинхронными методами, это немного усложняет ситуацию.

Я думал о возврате кортежа, содержащего как bool, так и код ответа, есть ли лучший способ сделать это?

Ответ 1

Я думал о возврате кортежа, содержащего как bool, так и код ответа, есть ли лучший способ сделать это?

Вы можете создать определенный класс для хранения результатов. Лично мне не нравятся кортежи, потому что имена типа Item1 или Item2 ничего не говорят о значениях.

class APICallResult
{
    public bool Success { get; set; }
    public HttpStatusCode StatusCode { get; set; }
}

    public static async Task<APICallResult> APICall(int bla)
    {
        HttpResponseMessage response;
        bool res;

        // Post/GetAsync to server depending on call + other logic
        return new APICallResult { Success = res, StatusCode = response.StatusCode };
    }

Ответ 2

Используйте Tuple<x, y>, чтобы вернуть больше значения. Например, чтобы вернуть int и строку:

return Tuple.Create(5, "Hello");

и тип Tuple<int, string>

Или вы могли бы имитировать out/ref с помощью массива... Если вы передадите методу массив из одного элемента, ему нужно передать ref или out (в зависимости от того, кто должен заполнить элемент):

MyMethod(new int[1] { 6 });

void MyMethod(int[] fakeArray)
{
    if (fakeArray == null || fakeArray.Length != 1)
    {
        throw new ArgumentException("fakeArray");
    }

    // as a `ref`
    fakeArray[0] = fakeArray[0] + 1;

    // as an `out`
    fakeArray[0] = 10;
}

Или используя сложные объекты...

class MyReturn
{
    public string Text { get; set; }
    public int Value { get; set; }
}

MyMethod(new MyReturn());

void MyMethod(MyReturn ret)
{
    ret.Text = "Hello";
    ret.Value = 10;
}

Готово...