/// <summary> /// Cache item with given Func<object> /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="cacheFunction"></param> /// <param name="interval"></param> /// <param name="dependencies"></param> /// <param name="priority"></param> /// <param name="removalCallback"></param> /// <param name="settings"></param> /// <returns></returns> public virtual T CacheItem <T>(string key, Func <object> cacheFunction, double interval = 30, ICacheDependency dependencies = null, CachePriority priority = CachePriority.Default, Action <string, object, CacheRemovalReason> removalCallback = null, ICacheSettings settings = null) { if (cacheFunction == null) { return(default(T)); } settings = settings ?? Settings; bool cacheEnabled = settings.Enabled; // Handle Structs if (_ReflectionHelper.IsValueType(typeof(T))) { // Boxing needed to avoid nullable checks on structs object o = GetCrossPlatformCacheData(key); T cachedValue = default(T); if (o != null) { cachedValue = (T)o; } // !EnableCache allows previewing to disable per user if (!cacheEnabled || o == null) { cachedValue = (T)cacheFunction(); if (cacheEnabled && interval > 0) { SetCrossPlatformCache(key, cachedValue, interval, dependencies, priority, removalCallback); } } return(cachedValue); } // Handle Classes var cachedData = GetCrossPlatformCacheData(key); // !EnableCache allows previewing to disable per user if (!cacheEnabled || cachedData == null) { cachedData = cacheFunction(); // If cached data is bad, store for a minute. if (cachedData == null) { interval = 60; cachedData = new NullData(); } if (cacheEnabled && interval > 0) { SetCrossPlatformCache(key, cachedData, interval, dependencies, priority, removalCallback); } } return((cachedData is NullData) ? default(T) : (T)cachedData); }