我想使用,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)
返回null
如果确定缓存条目key
不存在,它会提高NullReferenceException
,因为它试图做(T)null
(与T
值类型)
我怎么能得到类似的行为T
?
编辑:我删除了where T : class
因为这个约束阻止了我描述的情况。
编辑 2:我添加了一些代码来提供意图
问题是如果值为空,则转换可能会失败。因此,如果值为 null 则不要强制转换。
public T GetItem<T>(string key, Func<T> loadItemFromDb)
{
object cachedItem = memoryCache.Get(key);
if (cachedItem is T)
return (T)cachedItem;
T item = loadItemFromDb();
memoryCache.Add(key, item, somePolicy);
return item;
}
这里的值类型没有问题;如果 T 是一个值类型,而cachedItem
不是一个装箱的T
,那么我们永远不会强制转换cachedItem
为T
。
仅供参考,在 C# 7 中,您可以将其收紧一点:
if (cachedItem is T t)
return t;
现在根本没有演员表!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句