public async Task <T> GetAsync <T>(string key) where T : IConvertible { Config configuration = _cacheProvider.Get(key) ?? await _dataSource.GetAsync(_applicationName, key); if (configuration == null) { return(default(T)); } var conversionType = typeof(T); if (configuration.Type != conversionType.Name) { throw new InvalidCastException($"Configuration type {configuration.Type} is different than expected type {conversionType.Name}"); } var convertedValue = (T)Convert.ChangeType(configuration.Value, conversionType); _cacheProvider.Set(key, configuration); return(convertedValue); }