User4179525
User4179525

Reputation: 526

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

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

Answers (4)

Bruna Timoteo
Bruna Timoteo

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

datchung
datchung

Reputation: 4622

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

Upvotes: 6

Deepesh Bajracharya
Deepesh Bajracharya

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

User4179525
User4179525

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

Related Questions