diff --git a/NewLife.CubeNC/Session/SessionProvider.cs b/NewLife.CubeNC/Session/SessionProvider.cs index f7a472b2..700c69fc 100644 --- a/NewLife.CubeNC/Session/SessionProvider.cs +++ b/NewLife.CubeNC/Session/SessionProvider.cs @@ -1,5 +1,5 @@ -using NewLife.Caching; -using NewLife.Collections; +using System.Collections.Concurrent; +using NewLife.Caching; namespace NewLife.Cube; @@ -24,12 +24,52 @@ public class SessionProvider Cache.SetExpire(sessionKey, Expire); //!! 临时修正可空字典的BUG - if (Cache is MemoryCache mc && dic is not NullableDictionary) + if (Cache is MemoryCache mc && dic is not NullableDictionary2) { - dic = new NullableDictionary(dic, StringComparer.Ordinal); + dic = new NullableDictionary2(dic, StringComparer.Ordinal); mc.Set(sessionKey, dic); } return dic; } +} + + +/// 可空字典。获取数据时如果指定键不存在可返回空而不是抛出异常 +/// +/// +class NullableDictionary2 : ConcurrentDictionary, IDictionary where TKey : notnull +{ + /// 实例化一个可空字典 + public NullableDictionary2() { } + + /// 指定比较器实例化一个可空字典 + /// + public NullableDictionary2(IEqualityComparer comparer) : base(comparer) { } + + /// 实例化一个可空字典 + /// + public NullableDictionary2(IDictionary dic) : base(dic) { } + + /// 实例化一个可空字典 + /// + /// + public NullableDictionary2(IDictionary dic, IEqualityComparer comparer) : base(dic, comparer) { } + + /// 获取 或 设置 数据 + /// + /// + public new TValue this[TKey item] + { + get + { + if (TryGetValue(item, out var v)) return v; + + return default!; + } + set + { + base[item] = value; + } + } } \ No newline at end of file