using System.Collections; using XFEExtension.NetCore.AutoImplement; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 动态内存管理器 /// [CreateImpl] public abstract class DynamicMemoryManager : MemoryManager { /// /// 地址值字典 /// public Dictionary ItemDictionary { get; set; } = []; /// /// 索引器 /// /// 地址标识名 /// public DynamicMemoryItem this[string addressName] => ItemDictionary[addressName]; internal override void Add(MemoryItemBuilder builder) { if (builder.useResolvePointer) { if (builder.moduleName is null) throw new ArgumentNullException(nameof(builder), "对于使用基址指针表达式的构建器,模块名称是必须的"); builder.dynamicMemoryAddress = new(() => { try { return Editor.ResolvePointerAddress(builder.moduleName, builder.baseAddress, builder.offsets); } catch { return null; } }); } else { if (builder.dynamicMemoryAddress is null) throw new ArgumentNullException(nameof(builder), "对于动态地址管理器,构建器的动态地址不可为空"); } var dynamicMemoryItem = new DynamicMemoryItemImpl(builder.name, builder.dynamicMemoryAddress, builder.memoryAddressType, Editor); if (builder.hasListener) dynamicMemoryItem.AddListener(builder.listenerFrequency, builder.startListen); ItemDictionary.Add(builder.name, dynamicMemoryItem); } /// /// 获取枚举器 /// /// public override IEnumerator GetEnumerator() => ItemDictionary.GetEnumerator(); /// /// 释放资源 /// /// 地址标识名称 public override void Remove(string addressName) => ItemDictionary.Remove(addressName); /// /// 动态内存管理器 /// /// 内存构建器组 internal DynamicMemoryManager(params MemoryItemBuilder[] builders) { Add(builders); Editor.ValueChanged += (sender, e) => valueChanged?.Invoke(ItemDictionary[sender.Name], e); } }