C #: Общий метод / оболочка для методов с разными определениями - PullRequest
0 голосов
/ 01 февраля 2019

Например, у меня есть следующие методы:

    private async Task<T> Read<T>(string id, string endpoint)
    {
         //....
    }

    private async Task<List<T>> List<T>(int start, int count, string endpoint, List<FilterData> filterData = null)
    {
         //....
    }

(и более с различными свойствами) Но все эти методы могут выдавать BillComInvalidSessionException Если я вызвал метод, выдает это исключение, я хочу выполнитьнекоторая логика и отзыв вызвал метод.Т.е.:

    private async Task<T> ReadWithRetry<T>(string id, string endpoint)
    {
        try
        {
            return await Read<T>(id, endpoint);
        }
        catch (BillComInvalidSessionException)
        {
            SessionId = new Lazy<string>(() => LoginAsync().Result);
            return await ReadWithRetry<T>(id, endpoint);
        }
    }

    private async Task<List<T>> ListWithRetry<T>(int start, int count, string endpoint, List<FilterData> filterData = null)
    {
        try
        {
            return await List<T>(start, count, endpoint, filterData);
        }
        catch (BillComInvalidSessionException)
        {
            SessionId = new Lazy<string>(() => LoginAsync().Result);
            return await ListWithRetry<T>(start, count, endpoint, filterData);
        }
    }

Как создать один общий метод, который будет выполнять ту же логику, но получать разные методы в качестве параметров?

1 Ответ

0 голосов
/ 01 февраля 2019

Этого можно добиться с помощью универсального делегата:

private async Task<T> Retry<T>(Func<Task<T>> func)
{
    try
    {
        return await func();
    }
    catch (BillComInvalidSessionException)
    {
        SessionId = new Lazy<string>(() => LoginAsync().Result);
        return await Retry(func);
    }
}

И тогда ваши методы повтора будут превращаться в:

private async Task<T> ReadWithRetry<T>(string id, string endpoint)
{
    return await Retry(async () => await Read<T>(id, endpoint));
}

private async Task<List<T>> ListWithRetry<T>(int start, int count, string endpoint, List<FilterData> filterData = null)
{
    return await Retry(async () => await List<T>(start, count, endpoint, filterData));
}
...