如何从内存缓存中返回一个通用列表

3

我有一个主要围绕内存缓存工作的类。我有一个从缓存读取的函数。如何返回一个通用列表,以便可以根据类类型进行转换?

private ObjectCache cache = MemoryCache.Default; 
public List<T> GetCachedDataList<T>(string key)
{
    List<T> result = null;
    if (cache.Contains(key))
        result = cache[key] as List<T>;
    return result;
}

我想做类似这样的事情:
List<HelloClass> data = GetCachedDataList<HelloClass>("HelloString") as List<HelloClass>;

这是最好的方法吗?


我认为这段代码没有问题,除了我会将 List<T> result = null; 这一行改为 List<T> result = new List<T>();,这样在出现错误时就可以返回一个空列表而不是 null。此外,在函数调用后你不需要再加上 as List<HelloClass>;,因为它已经被转换过了。 - Marco Fatica
在你的最后一个代码示例中,你不需要 as List<HelloClass>,因为函数已经返回了正确的类型。 - Scott Chamberlain
函数看起来不错,但你不需要执行这个语句 GetCachedDataList<HelloClass>("HelloString") as List<HelloClass>; 函数已经返回了一个列表。 - warrior
1
@MarcoFatica 在这种情况下,这只意味着您没有意识到缓存未命中。至少使用空返回值,您肯定会在某个时候得到异常。我建议要么继续返回null,要么在缓存未命中时抛出异常。但是,我对该方法整体感到有些犹豫。现在它只是一个类型转换的包装器。 - sara
1个回答

4

如果你的方法已经返回了类型化的列表,那么你就不需要再次进行强制转换。只需使用你的代码而不进行转换:

List<HelloClass> data = GetCachedDataList<HelloClass>("HelloString");

为了使用更通用的解决方案,您可以实现以下方法:
public T GetCachedData<T>(string key)
{
    try
    {
        if (cache.Contains(key))
            return (T) cache[key];
        return default(T);
    }
    catch(InvalidCastException ex)
    {
        // We can't return null because T can be value type
        // then returns default value for T. For classes it will be null.
        return default(T);
    }
}

现在,您可以将此方法用于更多的场景:
List<HelloClass> data = GetCachedData<List<HelloClass>>("HelloString");
HelloClass data = GetCachedData<HelloClass>("HelloStringSingleValue");

什么是返回单个对象而不是对象列表的最佳方法? - user4031277
我不确定你的意思。如果你添加了一个单一的对象,你可以创建类似的通用方法 GetCachedData<T>,在这个方法中你将尝试将缓存数据转换为 T 并像这样使用它 GetCachedData<HelloClass>("SingleValue")。此外,你可以在这种情况下使用它来代替 GetCachedDataList,如 GetCachedData<List<HelloClass>>("HelloString") - Vadim Martynov
我遇到了一个错误:“类型参数‘T’无法与‘as’运算符一起使用,因为它没有类类型约束或‘class’。我正在使用以下函数:public T GetCachedData(string key) { T result = default(T); if (cache.Contains(key)) result = cache[key] as T; return result; } - user4031277
是的,因为“as”运算符仅适用于类。我已将整个代码更新到我的答案中。 - Vadim Martynov
让我担心的是,当缓存出现问题时,你会掩盖这种情况。如果我在给定的键下存储一个字符串并希望返回一个整数,我真的想知道我做错了什么,而不是像一切正常一样返回default(int)(=0)。 - Zdeněk Jelínek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接