C#:具有不同定义的方法的通用方法/包装器

时间:2019-02-01 01:53:21

标签: c# delegates func

例如,我有以下方法:

    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 :(得分:1)

您可以通过使用通用委托来实现:

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));
}