generics指针?

好吧所以我想创建一个将改变数据类型值的generics类。 我想这样做的原因是我可以使用undo和redo方法。 我可以为我需要的每种值类型编写一个类。 IE double,int …但如果我可以创建一个通用类来做这件事会容易得多。

这就是我所拥有的

class CommandChangeDouble : Command { double _previous; double _new; double* _objectRef; public unsafe CommandChangeDouble(double* o, double to) { _objectRef = o; _previous = *o; _new = to; *_objectRef = _new; } public unsafe void Undo() { *_objectRef = _previous; } public unsafe void Redo() { *_objectRef = _new; } } 

这就是我要的

 class CommandChangeValue : Command { T _previous; T _new; T* _objectRef; public unsafe CommandChangeValue(T* o, T to) { _objectRef = o; _previous = *o; _new = to; *_objectRef = _new; } public unsafe void Undo() { *_objectRef = _previous; } public unsafe void Redo() { *_objectRef = _new; } } 

但这给了我错误错误“无法获取地址,获取大小,或声明指向托管类型(’T’)的指针”

有没有更好的方法来做到这一点或解决这个错误的方法?

而不是提供指向值的指针,提供一个setter:

 class CommandChangeValue : Command { T _previous; T _new; Action _set; public CommandChangeValue(T value, Action setValue, T newValue) { _previous = value; _new = newValue; _set = setValue; setValue(_new); } public void Undo() { _set(_previous); } public void Redo() { _set(_new); } } // ... double v = 42; var c = new CommandChangeValue(v, d => v = d, 99); 

只是为了记录,您可以使用这些方法获得指向generics类型或任何其他类型的指针….

  ///  /// Provides the current address of the given element ///  ///  ///  ///  [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] public static System.IntPtr AddressOf(T t) //refember ReferenceTypes are references to the CLRHeader //where TOriginal : struct { System.TypedReference reference = __makeref(t); return *(System.IntPtr*)(&reference); } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] static System.IntPtr AddressOfRef(ref T t) //refember ReferenceTypes are references to the CLRHeader //where TOriginal : struct { System.TypedReference reference = __makeref(t); System.TypedReference* pRef = &reference; return (System.IntPtr)pRef; //(&pRef) } 

我和其他几个人一起使用它们来实现与数组一起使用的切片forms。

不要使用指针。

如果您使用普通引用,并始终通过此类中的属性与值进行交互,则一切都将正常工作。

不要使用指针,如另一个答案和评论中所述。 如果您想在应用程序中使用某些撤消/重做function,您可能需要查看Memento模式 。