2

System.Runtime.Caching用来存储一个List<MyType>. 问题是当我检索它返回的集合时System.Object.

我试过把它扔回去List<MyType>,但没有运气。

如果我尝试as,我会得到一个null

var siteNodes = _cacheManager.Get(Constants.CacheKeys.SiteNodesCacheKey) 
                as List<SiteNode>;

存储和检索我List<MyType>的缓存的正确方法是什么?

我正在使用缓存管理器类来访问缓存。

public void Add(string key, object data, int cacheTime,
                CacheEntryRemovedCallback callback)
    {
        _callback = callback;
        Add(key, data, cacheTime);
    }

public object Get(string key)
    {
        return Cache[key];
    }

var siteNodes = _cacheManager.Get(Constants.CacheKeys.SiteNodesCacheKey) 
                as List<SiteNode>;

这是添加到缓存的方法

public void Add(string key, object data, int cacheTime, 
                CacheEntryRemovedCallback callback)
    {
        _callback = callback;
        Add(key, data, cacheTime);
    }

这是与我的缓存管理器类交互的方法。

private void CacheData(IEnumerable<object> data, string cacheKey)
    {
        if (_cacheManager.Contains(cacheKey))
        {
            _cacheManager.Remove(cacheKey);
        }

        _cacheManager.Add(cacheKey, data, DefaultCacheTime);

    }

上述方法是我的问题的根源,为了保持我的方法可重用,我将第一个参数作为对象的 IEnumerable,它正在更改我正在存储的数据。

所以我创建了以下覆盖..

private void CacheData(List<SiteNode> data, string cacheKey)
    {
        if (_cacheManager.Contains(cacheKey))
        {
            _cacheManager.Remove(cacheKey);
        }

        _cacheManager.Add(cacheKey, data, DefaultCacheTime);

    }

奇迹般有效!

4

2 回答 2

2

你可以像这样硬铸它:

var siteNodes = (List<SiteNode>)_cacheManager.Get(Constants.CacheKeys.SiteNodesCacheKey);

但是,如果缓存已使对象过期,这也会中断。相反,您首先需要测试是否为 null(或执行 contains 以查看它是否在缓存中),然后进行硬转换:

List<SiteNode> siteNodes;

object cached_site_nodes = _cacheManager.Get(Constants.CacheKeys.SiteNodesCacheKey);

if (null != cached_site_nodes)
{
   siteNodes = (List<SiteNode)cached_site_nodes;
}
else
{
   siteNodes = new List<SiteNode>();
}

通过使用“as”关键字,您可以有效地测试底层对象是否为 List 类型,并且它返回 null,因为System.Runtime.Caching.ObjectCache不知道缓存中的类型是什么。

于 2013-05-17T02:45:18.570 回答
2

我一直在与同样的错误作斗争。对我来说,修复是硬转换 CacheItem.Value,而不是 CacheItem,例如:

return (IEnumerable<ObjType>)MyCacheItem.Value;

不是...

return (IEnumerable<ObjType>)MyCacheItem;

(导致异常)。

于 2014-03-12T22:18:44.293 回答