2016-08-01 3 views
0

派生したCacheItemを使用してMemoryCacheを実装していますが、キャッシュに入ったらそれとのやりとりが難しいです。たとえば:MemoryCacheからカスタムCacheItemを取得する

class Program 
{ 
    static void Main(string[] args) 
    { 
     MemoryCache cache = MemoryCache.Default; 
     CacheItemPolicy policy = new CacheItemPolicy(); 
     CustomCacheItem someItem = (CustomCacheItem)cache.AddOrGetExisting(new CustomCacheItem(1, "tacos", "waffles"), policy); 

     Console.ReadLine(); 
    } 
} 

public class CustomCacheItem : CacheItem 
{ 
    public int FailureCt { get; set; } 

    public CustomCacheItem(int _failureCt, string _key, string _value) 
     : base(_key, _value) 
    { 
     FailureCt = _failureCt; 
    } 
} 

は、これは一種の理にかなってUnable to cast object of type 'System.Runtime.Caching.CacheItem' to type 'CacheTest.CustomCacheItem'.のエラーをスローします。おそらくキャッシュアイテムの情報を保持していないかもしれませんが、もしそうなら、私はどのようにカスタムキャッシュアイテムを取り出せますか?戻り値が汎用基本型の場合、そのプロパティ(この場合はFailureCt)とどのように対話しますか?

+0

CacheItemから派生する目的は何ですか? CacheItemは、キャッシュへのエントリとデータのラッパーとして機能します。 'CacheItem item =(CacheItem)cache.AddOrGetExisting(新しいCacheItem(1、" tacos "、" waffles ")、policy);' item.valueはデータを返します。 **ドキュメントの状態として、キーが存在する場合はnullを返します** [https://msdn.microsoft.com/en-us/library/dd988741.aspx](https://msdn.microsoft.com) /en-us/library/dd988741.aspx) – hdz

+0

@hdzええ、私は、CacheItemがより大きなキャッシュ構造でどのように使用されたかについて、間違った前提があったと思います。私は余分な情報はすべてそれとともに保存されていると思ったが、それはそうではないようだ。 – Xedni

答えて

1

理由はMemoryCache.AddOrGetExisting(CacheItem, CacheItemPolicy)が内部で新しいCacheItemを作成していることである。

public override CacheItem AddOrGetExisting(CacheItem item, CacheItemPolicy policy) 
{ 
    if (item == null) 
     throw new ArgumentNullException("item"); 
    return new CacheItem(item.Key, AddOrGetExistingInternal(item.Key, item.Value, policy)); 
} 

MemoryCache source code


私は値そのものではなくCacheItemラッパーでFailureCtを格納お勧めします:

public class CacheValue 
{ 
    public int FailureCt { get; set; } 
    public string Value { get; set; } 
} 

次に:

CacheValue someItem = (CacheValue)cache.AddOrGetExisting("tacos", new CacheValue() 
{ 
    FailureCt = 1, 
    Value = "waffles" 
}, policy); 
+0

ああ、興味深い。私はCacheItemが単なる値ではなく、私が上書きすべきであるという誤った仮定を持っていたと思います。ありがとう! – Xedni

関連する問題