首页 > 其他分享 >.net 7 获取所有缓存键的问题?

.net 7 获取所有缓存键的问题?

时间:2022-11-30 09:11:38浏览次数:42  
标签:缓存 keys cache coherentState GetValue 获取 BindingFlags var net

这里是群友提供听说是issue提的问题,高手回答的。

var coherentState = _cache.GetType().GetField("_coherentState", BindingFlags.NonPublic | BindingFlags.Instance); var coherentStateValue = coherentState.GetValue(_cache); var entriesCollection = coherentStateValue.GetType().GetProperty("EntriesCollection", BindingFlags.NonPublic | BindingFlags.Instance); var entriesCollectionValue = entriesCollection.GetValue(coherentStateValue) as ICollection; var keys = new List<string>(); if (entriesCollectionValue != null) { foreach (var item in entriesCollectionValue) { var methodInfo = item.GetType().GetProperty("Key"); var val = methodInfo.GetValue(item); keys.Add(val.ToString()); } } return keys;

由于.net 7源码改变了,_entries外面又套了一层_coherentState,致使无法获取所有键值。

通过查看源码我自己修改了如下代码:

       var ggt = _cache.GetType();
           var _coherentStates = ggt.GetRuntimeFields(); 
            var keys = new List<string>();
            foreach (var f in _coherentStates)
            {
                if(f.Name == "_coherentState")
                {
                   var ftype = f.FieldType;
                    var ssss= ftype.GetRuntimeFields();
                   foreach(var ss in ssss)
                    {
                        if (ss.Name == "_entries")
                        {
                            var eee = ss.GetValue(f.GetValue(_cache));
                            if (eee != null)
                            { 
                                var cacheItems = eee as IDictionary;
                                if (cacheItems == null) return keys;
                                foreach (DictionaryEntry cacheItem in cacheItems)
                                {
                                    if (!string.IsNullOrEmpty(key))
                                    {
                                        if (cacheItem.Key.ToString().Contains(key))
                                        {
                                            keys.Add(cacheItem.Key.ToString());
                                        }
                                    }
                                    else
                                    {
                                        keys.Add(cacheItem.Key.ToString());
                                    }
                                }
                            }
                        }
                    }
                }
            }
         
            return keys;

 

标签:缓存,keys,cache,coherentState,GetValue,获取,BindingFlags,var,net
From: https://www.cnblogs.com/duoe/p/16937377.html

相关文章