从 C# 中获取 <cache> 标签助手的 vary-by 属性值

Get value of vary-by attribute of <cache> tag helper from c#

我想通过标签助手生成的特定键来清除内存缓存。可以使用以下代码清除缓存标签生成的整个内存缓存。

public partial class MemoryCacheManager : CacheKeyService, ILocker, IStaticCacheManager
{
    private readonly CacheTagHelperMemoryCacheFactory _factory;
    public MemoryCacheManager(AppSettings appSettings, IMemoryCache memoryCache, 
                        CacheTagHelperMemoryCacheFactory factory) : base(appSettings)
    {
        _memoryCache = memoryCache;
        _factory = factory;
    }

    public Task ClearAsync()
    {
        PropertyInfo prop = _factory.Cache.GetType().GetProperty("EntriesCollection", BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
        var allInnerCacheTags = prop.GetValue(_factory.Cache) as ICollection;

        foreach (var item in allInnerCacheTags)
        {
            object cacheKeyOfTag = item.GetType().GetProperty("Key",  BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
            _memoryCache.Remove(cacheKeyOfTag);
        }
    }
}

但我想通过特定键删除缓存条目,如附图。

有什么方法可以得到_varyBy的值吗

我能够获取“_varyBy”的值。下面的代码对我 net5.0 有用。假设也适用于 net3.2

public partial class MemoryCacheManager
{
    private readonly CacheTagHelperMemoryCacheFactory _factory;
    private readonly IMemoryCache _memoryCache;

    public MemoryCacheManager(IMemoryCache memoryCache, 
                              CacheTagHelperMemoryCacheFactory factory)
    {
        _memoryCache = memoryCache;
        _factory = factory;
    }

    public void ClearCacheTagAsync(string cachekey)
    {
        PropertyInfo prop = _factory.Cache.GetType().GetProperty("EntriesCollection", BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
        var allInnerCacheTags = prop.GetValue(_factory.Cache) as ICollection;
        foreach (var cacheEntry in allInnerCacheTags)
        {
            var theKeyValueOfEntry = cacheEntry.GetType().GetProperties().ToDictionary(property => property.Name, property => property.GetValue(cacheEntry));

            var item = theKeyValueOfEntry.FirstOrDefault();
            var cacheTag = ((CacheTagKey)item.Value);
            var field = cacheTag.GetType().GetField("_varyBy", BindingFlags.NonPublic | BindingFlags.Instance);
            var actualValue = field.GetValue(cacheTag);

            if (cachekey == actualValue.ToString())
            {
                _memoryCache.Remove(cacheEntry);
            }
        }
    }    
}