MemoryCache 与泛型的正确使用?

Cal*_*ero 2 c# generics value-type reference-type 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
}
Run Code Online (Sandbox Code Playgroud)

MemoryCache.Get(string key)返回null如果确定缓存条目key不存在,它会提高NullReferenceException,因为它试图做(T)null(与T值类型)

我怎么能得到类似的行为T

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

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

Eri*_*ert 6

问题是如果值为空,则转换可能会失败。因此,如果值为 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;
}
Run Code Online (Sandbox Code Playgroud)

这里的值类型没有问题;如果 T 是一个值类型,而cachedItem不是一个装箱的T,那么我们永远不会强制转换cachedItemT

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

    if (cachedItem is T t)
       return t;
Run Code Online (Sandbox Code Playgroud)

现在根本没有演员表!