using System.Collections; using XFEExtension.NetCore.AutoImplement; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 可更新内存管理器 /// [CreateImpl] public class UpdatableMemoryManager : MemoryManager { /// /// 地址值字典 /// public Dictionary ItemDictionary { get; set; } = []; /// /// 索引器 /// /// 地址标识名 /// public UpdatableMemoryItem 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.updatableMemoryAddress = new(() => { try { return Editor.ResolvePointerAddress(builder.moduleName, builder.baseAddress, builder.offsets); } catch { return null; } }); } else { if (builder.updatableMemoryAddress is null) throw new ArgumentNullException(nameof(builder), "对于可更新内存管理器,构建器更新地址的方法不可为空"); } var updatableMemoryItem = new UpdatableMemoryItemImpl(builder.name, builder.updatableMemoryAddress, builder.memoryAddressType, Editor); if (builder.hasListener) updatableMemoryItem.AddListener(builder.listenerFrequency, builder.startListen); ItemDictionary.Add(builder.name, updatableMemoryItem); } /// /// 获取枚举器 /// /// public override IEnumerator GetEnumerator() => ItemDictionary.GetEnumerator(); /// /// 释放资源 /// /// 地址标识名称 public override void Remove(string addressName) => ItemDictionary.Remove(addressName); /// /// 可更新内存管理器 /// /// 内存构建器组 internal UpdatableMemoryManager(params MemoryItemBuilder[] builders) { Add(builders); Editor.ValueChanged += (sender, e) => valueChanged?.Invoke(ItemDictionary[sender.Name], e); } }