Get all Cached Objects which are cached using MemoryCache class c#

21.6k views Asked by At

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.

4

There are 4 answers

0
User4179525 On BEST ANSWER

This is what i found (it may help some one)

foreach (var item in MemoryCache.Default)
{
   //add the item.keys to list
}
return list;
0
Bruna Timoteo On
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;
0
Deepesh Bajracharya On

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;
}
0
datchung On

This should also work: MemoryCache.Default.ToList();