【发布时间】:2013-06-13 22:02:01
【问题描述】:
好的,所以我想创建一个通用类来更改数据类型的值。我想这样做的原因是我可以有撤消和重做方法。我可以为我需要的每个值类型编写一个类。 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<T> : 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') 的指针”
是否有更好的方法来执行此操作或解决此错误?
【问题讨论】:
-
这类问题的答案总是:不要使用指针。
-
请注意,如果您想多次撤消,则需要一个堆栈。
-
.NET 中的引用是类型安全的指针...在 C# 中使用“纯”指针有点过头了。
-
@SLaks 是的,我不想使用指针,但我想不出另一种方法来实现我想要的。也是的,我有 2 个 List
来跟踪 Undo 和 Redo -
问题是你只能做一个不包含引用的值类型的指针,你不能将泛型参数约束到这些类型。
标签: c# generics pointers value-type