using XFEExtension.NetCore.AutoImplement; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 内存条目构建器 /// [CreateImpl] public abstract class MemoryItemBuilder { internal string name = string.Empty; internal bool hasListener; internal bool startListen; internal bool useResolvePointer; internal Type memoryAddressType = typeof(int); internal TimeSpan listenerFrequency; internal nint? staticMemoryAddress; internal Func? dynamicMemoryAddress; internal Func? updatableMemoryAddress; internal string? moduleName; internal nint baseAddress; internal nint[] offsets = []; /// /// 为该地址添加监听器 /// /// 监听频率 /// 是否立即开始监听(监听器会自动创建但是默认不会立即开始监听) /// public MemoryItemBuilder WithListener(TimeSpan frequency, bool startListen = false) { hasListener = true; listenerFrequency = frequency; this.startListen = startListen; return this; } /// /// 为该地址添加监听器 /// /// 监听频率,单位为毫秒 /// 是否立即开始监听(监听器会自动创建但是默认不会立即开始监听) /// public MemoryItemBuilder WithListener(int frequency = 1, bool startListen = false) { hasListener = true; listenerFrequency = TimeSpan.FromMilliseconds(frequency); this.startListen = startListen; return this; } /// /// 使用静态地址 /// /// 静态地址 /// public MemoryItemBuilder WithStaticMemoryAddress(nint memoryAddress) { staticMemoryAddress = memoryAddress; return this; } /// /// 使用动态地址 /// /// 内存地址动态获取方法 /// public MemoryItemBuilder WithDynamicMemoryAddress(Func memoryAddressGetFunc) { dynamicMemoryAddress = memoryAddressGetFunc; return this; } /// /// 使用基址指针动态表达式 /// /// 模块名称 /// 模块的地址部分 /// 基址指针偏移部分 /// public MemoryItemBuilder WithResolvePointer(string moduleName, nint baseAddress, params nint[] offsets) { useResolvePointer = true; this.moduleName = moduleName; this.baseAddress = baseAddress; this.offsets = offsets; return this; } /// /// 使用可更新内存地址 /// /// 内存地址更新方法 /// public MemoryItemBuilder WithUpdatableMemoryAddress(Func memoryAddressUpdateFunc) { updatableMemoryAddress = memoryAddressUpdateFunc; return this; } /// /// 构建内存地址 /// /// 内存地址的数据类型 /// 内存地址自定义标识名 /// public static MemoryItemBuilder Create(string name) => new MemoryItemBuilderImpl { name = name, memoryAddressType = typeof(T) }; }