【发布时间】:2018-03-15 21:20:00
【问题描述】:
我希望使用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 时引发NullReferenceException(使用T 值类型)
我怎样才能为每个 T 获得类似的行为?
编辑:我删除了where T : class,因为这个约束阻止了我所描述的情况。
编辑 2:我添加了一些代码来提供意图
【问题讨论】:
-
var item = memoryCache.Get(key) as T; -
@RonBeyer 我认为
as仅供参考和可空类型? -
你的
where T : class使T可以为空,它不能是值类型,class只是一个引用类型。 -
那你需要检查类型:
var item = memoryCache.Get(key); if (item is T) return (T)item; else return default(T);或者类似的东西。 -
您问“我该如何解决这个问题?”不说你想发生什么。我假设你不想可怕地崩溃,但你还没有说出你想要发生的事情。你打电话给
GetItem<int>("foo")并且key foo 不存在,然后......会发生什么?
标签: c# generics value-type reference-type memorycache