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

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

    }

魔法のように動作します!

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 型であるかどうかを効果的にテストできますSystem.Runtime.Caching.ObjectCache。また、キャッシュ内にあるときの型がわからないため、null を返します。

于 2013-05-17T02:45:18.570 に答える
2

私はちょうど同じエラーと戦っています。私にとっての修正は、CacheItem ではなく CacheItem.Value をハードキャストすることでした。

return (IEnumerable<ObjType>)MyCacheItem.Value;

いいえ...

return (IEnumerable<ObjType>)MyCacheItem;

(例外が発生しました)。

于 2014-03-12T22:18:44.293 に答える