Reputation: 526
I want to retrieve all the cache objects that are added using MemoryCache.
I tried the below but it is not retrieving them
System.Web.HttpContext.Current.Cache.GetEnumerator();
System.Web.HttpRuntime.Cache.GetEnumerator();
Note: Retreive all means not just what i know and created, i mean every cache object that gets created in the application.
Upvotes: 13
Views: 23155
Reputation: 1
private static readonly Type MemoryCacheType = typeof(MemoryCache);
private static readonly FieldInfo CoherentStateFieldInfo = MemoryCacheType.GetField("_coherentState", BindingFlags.NonPublic | BindingFlags.Instance);
private static Type _coherentStateType;
var coherentState = CoherentStateFieldInfo.GetValue(memoryCache);
var coherentStateType = _coherentStateType ??= coherentState?.GetType();
var propertyInfo = coherentStateType!.GetProperty("EntriesCollection", BindingFlags.NonPublic | BindingFlags.Instance)!;
if (propertyInfo.GetValue(coherentState) is not ICollection colecao)
yield break;
Upvotes: 0
Reputation: 201
Here is a better way to enumerate and get the result:
public virtual List<T> GetCache<T>()
{
List<T> list = new List<T>();
IDictionaryEnumerator cacheEnumerator = (IDictionaryEnumerator)((IEnumerable)Cache).GetEnumerator();
while (cacheEnumerator.MoveNext())
list.Add((T) cacheEnumerator.Value);
return list;
}
Upvotes: 9
Reputation: 526
This is what i found (it may help some one)
foreach (var item in MemoryCache.Default)
{
//add the item.keys to list
}
return list;
Upvotes: 24