好吧,正如评论中所讨论的那样,我没有修复你的代码,只是重新编写代码以使用不同的架构,我认为它会更好地为你工作,假设它不会破坏你需要的其他功能。
我的代码的主要目标是使变量不保留其值的副本,而是在检索值时查看内存存储本身,同样使用内存存储来设置其值。
所有变量存储都是指向内存位置(IMemory对象中的地址)的“指针”。 IMemory对象提供读取和写入操作,以从存储器读取和写入一个或多个连续字节。
IMemory公开了一个MemoryChanged事件,只要发生Write操作就会触发该事件。变量在其构造函数中附加到此事件,并在接收到事件时检查是否有任何更改的地址覆盖变量的任何部分。如果他们这样做,则该变量将触发其INotifyPropertyChanged事件,WPF等人可以使用该事件来监视变量更新。
现在代码:
public interface IMemory { void Write(int address, params byte[] bytes); byte[] Read(int address, int numBytes); byte Read(int address); event MemoryChangedEventHandler MemoryChanged; } public class Memory : IMemory { private readonly byte[] _memory; public Memory(int size) { _memory = new byte[size]; } public void Write(int address, params byte[] bytes) { for (int offset = 0; offset < bytes.Length; offset++) { _memory[address + offset] = bytes[offset]; } UpdateMemory(address, bytes.Length); } public byte[] Read(int address, int numBytes) { return _memory.Skip(address).Take(numBytes).ToArray(); } public byte Read(int address) { return _memory[address]; } private void UpdateMemory(int address, int length) { if (MemoryChanged != null) { MemoryChanged(this, new MemoryChangedEventArgs { StartAddress = address, EndAddress = address + length }); } } public event MemoryChangedEventHandler MemoryChanged; } public delegate void MemoryChangedEventHandler(object sender, MemoryChangedEventArgs e); public class MemoryChangedEventArgs { public int StartAddress { get; set; } public int EndAddress { get; set; } } public class IntVariable : INotifyPropertyChanged { private readonly int _address; private readonly Memory _memory; public IntVariable(int address, Memory memory) { _address = address; _memory = memory; _memory.MemoryChanged += MemoryChanged; } private void MemoryChanged(object sender, MemoryChangedEventArgs e) { int startAddress = _address; int endAddress = startAddress + sizeof (int); int changedStartAddress = e.StartAddress; int changedEndAddress = e.EndAddress; if (IsVariableChanged(startAddress, changedStartAddress, endAddress, changedEndAddress)) { OnPropertyChanged("Value"); } } private static bool IsVariableChanged(int startAddress, int changedStartAddress, int endAddress, int changedEndAddress) { return Math.Max(startAddress, changedStartAddress) <= Math.Min(endAddress, changedEndAddress); } public int Value { get { var intBytes = _memory.Read(_address, sizeof(int)); return BitConverter.ToInt32(intBytes, 0); } set { var intBytes = BitConverter.GetBytes(value); _memory.Write(_address, intBytes); } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } }
因此,您将构造您的Memory对象,然后创建IntVariable(显然您将创建不同可视化所需的不同变量类型)引用Memory对象的对象和内存中的地址。
例如。
var _memory = new Memory(20); var variable1 = new IntVariable(0, _memory); var variable2 = new IntVariable(0, _memory);
然后做 variable1.Value = 4; 会使variable1和variable2触发它们的INotifyPropertyChanged事件。
variable1.Value = 4;
希望这是你想要的。