.Net 7.0 MemoryCache 获取所有缓存Key失效
.Net 7.0,用到微软的MemoryCache时,在封装通用方法时候需要获取所有CacheKey。
目前搜索到的方案都是直接取“_entries” 私有字段。 但在7.0版本之后被包裹在“_coherentState”中,且“_entries” 被划入运行时字段,需要通过GetRuntimeFields来获取。
首先说明_memoryCache变量是MemoryCache类的实例,具体代码如下:
1 const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 2 var coherentStateFiledInfo = _memoryCache.GetType().GetField("_coherentState", flags); 3 var coherentStateValue = coherentStateFiledInfo.GetValue(_memoryCache); 4 var entriesFiledInfo = coherentStateFiledInfo.FieldType.GetRuntimeFields().Where(f => f.Name == "_entries").FirstOrDefault(); 5 var entries = entriesFiledInfo.GetValue(coherentStateValue); 6 7 var cacheItems = entries as IDictionary;
这里 cacheItems 就是所有的key和value了。