在System.Runtime.Caching中存储泛型集合 - 列出<t> </t>

时间:2013-05-17 02:07:22

标签: c# asp.net .net

我正在使用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);
    }

以下是与我的cachemanager类进行交互的方法。

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);

    }

像魅力一样!

2 个答案:

答案 0 :(得分:0)

你可以像这样强硬:

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

但是如果缓存已经使对象过期,这也会破坏。相反,你首先需要测试是否为null(或者执行包含以查看它是否在缓存中),然后进行强制转换:

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不知道缓存中的类型是什么。

答案 1 :(得分:0)

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

return (IEnumerable<ObjType>)MyCacheItem.Value;

...不

return (IEnumerable<ObjType>)MyCacheItem;

(导致例外)。