代码之家  ›  专栏  ›  技术社区  ›  Oleg Sh

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

  •  0
  • Oleg Sh  · 技术社区  · 5 年前

    例如,我有以下方法:

        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 回复  |  直到 5 年前
        1
  •  1
  •   devNull    5 年前

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

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