using System.Collections.ObjectModel; using GFramework.Core.Abstractions.Bases; namespace GFramework.Core.Abstractions.Registries; /// /// 基于Dictionary的通用键值注册表基类 /// 提供基于字典的键值对注册、查询和管理功能 /// /// 键的类型 /// 值的类型 public abstract class KeyValueRegistryBase : IRegistry { /// /// 存储键值对映射关系的字典 /// protected readonly IDictionary Map; /// /// 初始化KeyValueRegistryBase的新实例 /// /// 用于比较键的相等性的比较器,如果为null则使用默认比较器 protected KeyValueRegistryBase(IEqualityComparer? comparer = null) { // 使用指定的比较器或默认比较器创建字典 Map = new Dictionary(comparer ?? EqualityComparer.Default); } /// /// 根据指定的键获取对应的值 /// /// 要查找的键 /// 与键关联的值 /// 当键不存在时抛出异常 public virtual TValue Get(TKey key) { return Map.TryGetValue(key, out var value) ? value : throw new KeyNotFoundException($"{GetType().Name}: key not registered: {key}"); } /// /// 判断是否包含指定的键 /// /// 要检查的键 /// 如果包含该键返回true,否则返回false public virtual bool Contains(TKey key) { return Map.ContainsKey(key); } /// /// 注册键值对到注册表中 /// /// 要注册的键 /// 要注册的值 /// 当前注册表实例,支持链式调用 public virtual IRegistry Registry(TKey key, TValue value) { Map.Add(key, value); return this; } /// /// 注册键值对映射对象到注册表中 /// /// 包含键值对的映射对象 /// 当前注册表实例,支持链式调用 public virtual IRegistry Registry(IKeyValue mapping) { return Registry(mapping.Key, mapping.Value); } /// /// 从注册表中移除指定键的项 /// /// 要移除的键 /// 如果成功移除则返回true,否则返回false public bool Unregister(TKey key) { return Map.Remove(key); } /// /// 获取注册表中所有的键值对 /// /// 包含所有注册键值对的只读字典 public IReadOnlyDictionary GetAll() { return Map as IReadOnlyDictionary ?? new ReadOnlyDictionary(Map); } /// /// 获取注册表中所有的值 /// /// 包含所有注册值的只读集合 public IReadOnlyCollection Values() { return Map.Values as IReadOnlyCollection ?? new ReadOnlyCollection(Map.Values.ToList()); } /// /// 获取注册表中所有的键 /// public IEnumerable Keys => Map.Keys; /// /// 获取注册表中项的数量 /// public int Count => Map.Count; }