using XFEExtension.NetCore.AutoImplement; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 动态内存 /// /// 自定义标识名 /// 内存地址动态获取方法 /// 内存地址数据类型 /// 内存修改器 [CreateImpl] public abstract class DynamicMemoryItem(string name, Func memoryAddressGetFunc, Type memoryItemType, MemoryEditor memoryEditor) : MemoryItem(name, memoryItemType, memoryEditor) { /// /// 内存地址动态获取方法 /// public Func MemoryAddressGetFunc { get; init; } = memoryAddressGetFunc; /// /// 监听器 /// public DynamicMemoryListener? Listener { get; protected set; } /// public override bool HasListener { get => Listener is not null; } /// public override void AddListener(TimeSpan? frequency = null, bool startListen = false) => Listener = memoryEditor.AddDynamicListener(Name, MemoryAddressGetFunc, frequency, MemoryItemType, startListen); /// public override bool Read(out T result) => memoryEditor.ReadMemory(MemoryAddressGetFunc.Invoke()!.Value, out result); /// public override void RemoveListener() { memoryEditor.RemoveListener(Name); Listener = null; } /// public override async Task StopListen() { if (Listener is null) throw new InvalidOperationException($"{nameof(Listener)} 监听器为空"); IsListening = false; await Listener.StopListen(); } /// public override bool Write(T value) => memoryEditor.WriteMemory(MemoryAddressGetFunc.Invoke()!.Value, value); internal override async Task StartListen(nint processHandler, TimeSpan? frequency = null) { if (Listener is null) throw new InvalidOperationException($"{nameof(Listener)} 监听器为空"); IsListening = true; memoryEditor.ListenerManager.IsListening = true; await Listener.StartListen(processHandler, frequency); } }