MemoryCache 与泛型的正确使用?

卡利梅罗

我想使用,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,那么我们永远不会强制转换cachedItemT

仅供参考,在 C# 7 中,您可以将其收紧一点:

    if (cachedItem is T t)
       return t;

现在根本没有演员表!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Timer插入的MemoryCache触发方法?

来自分类Dev

为什么MemoryCache使用浅拷贝?

来自分类Dev

正确使用列表中的泛型

来自分类Dev

在事件声明中正确使用泛型

来自分类Dev

在Java中正确使用泛型

来自分类Dev

使用泛型正确扩展接口

来自分类Dev

在事件声明中正确使用泛型

来自分类Dev

如何为 Holder 正确使用泛型

来自分类Dev

在asp.net MVC应用程序中使用memorycache,每次都会创建它

来自分类Dev

MVC 6的MemoryCache应该在控制器级别还是在服务级别使用?

来自分类Dev

在asp.net MVC应用程序中使用memorycache每次都会创建它

来自分类Dev

在 .net core mvc 2.1 中使用 MemoryCache 并将应用程序部署在 azure WebApp 上

来自分类Dev

与 Lazy<T> 一起使用时,如何从 MemoryCache 中识别和排除异常?

来自分类Dev

Redis vs MemoryCache

来自分类Dev

MemoryCache和PhysicalMemoryLimit

来自分类Dev

正确转换泛型

来自分类Dev

泛型转换器 - 我是否正确使用泛型?

来自分类Dev

如果缓存已满,则使用相同的键第二次调用MemoryCache.Set()会擦除条目

来自分类Dev

如何正确使用泛型在这种情况下?

来自分类Dev

如何使用泛型正确指定Class <?>参数

来自分类Dev

使用泛型返回从类型中提取的正确类

来自分类Dev

从MemoryCache删除所有项目

来自分类Dev

MemoryCache absoluteExpiration和内存限制

来自分类Dev

从MemoryCache异步获取线程安全

来自分类Dev

MemoryCache 過期值 .NET

来自分类Dev

泛型执行请求,使用泛型

来自分类Dev

泛型类使用泛型参数

来自分类Dev

是否使用泛型?

来自分类Dev

Java使用泛型