我正在使用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);
}
像魅力一样!
答案 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;
(导致例外)。