gpt4 book ai didi

c# - 正确使用 MemoryCache 和泛型?

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:11 33 4
gpt4 key购买 nike

我想使用 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 并且它会引发 NullReferenceException 因为它试图执行 (T)null (使用 T 值类型)

如何为每个 T 获得相似的行为?

编辑:我删除了 where T : class 因为这个约束阻止了我正在描述的情况。

编辑 2:我添加一些代码来提供意图

最佳答案

问题是如果值为 null,转换可能会失败。因此,如果值为 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;

现在根本没有 Actor !

关于c# - 正确使用 MemoryCache 和泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49309431/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com