我希望使用System.Runtime.Caching.MemoryCache
,但我想知道如何与泛型一起使用。
在下面的示例中,如果T
是值类型,我会有麻烦。
public T GetItem<T>(string key, Func<T> loadItemFromDb)
{
var cachedItem = (T) memoryCache.Get(key);
if(cachedItem != null)
return cachedItem;
// call db
//put result in cache
// return result
}
MemoryCache.Get(string key)
如果缓存中不存在由key
标识的缓存条目,它将返回null
,并尝试执行(T)null
(其中T
是值类型),这会引发NullReferenceException
异常。
如何为每个T
获得类似的行为?
编辑:我已删除where T:class
,因为此约束条件会阻止我描述的情况。
编辑2:我添加了一些代码以提供意图。
var item = memoryCache.Get(key) as T;
- Ron Beyeras
只适用于引用类型和可空类型? - Calimerowhere T : class
使得T
可空,它不能是值类型,class
只针对引用类型。 - Ron Beyervar item = memoryCache.Get(key); if (item is T) return (T)item; else return default(T);
或类似的内容。 - Ron BeyerGetItem<int>("foo")
函数,但 key 值 foo 并不存在,那么会发生什么? - Eric Lippert