3

我正在玩一个 undo-redo 实现,我希望它的堆栈上的一个 undo 或 redo 项包含对某个Func<out TResult>地方的引用,TResult它本身就是一个Func<TResult>. 关键是当Func从撤消堆栈调用时,返回值然后存储在重做堆栈中(反之亦然)。

我不确定是否可以这样做,因此这个问题。

正如您在此处看到的那样,我能想到的最好的方法都行不通:

struct UndoRedoItem
{
    public Func<Func<Func<Func<Func<Func<......>>>>>> UndoOrRedoFunc;
    public string Description;
    ... 
}
4

2 回答 2

3

正如您所发现的,让 undo Func 直接返回 redo Func 是行不通的,因为所需的类型参数会无限增长。您需要做的是引入一个间接级别,例如,让 undo Func 返回 UndoRedoItem 以放置在重做堆栈上,而不仅仅是重做 Func:

struct UndoRedoItem
{
    public Func<UndoRedoItem> UndoOrRedoFunc;
    public string Description;
    ... 
}
于 2012-07-07T19:17:59.317 回答
3

您应该研究命令模式以实现您想要的。

一个命令封装了执行某个任务的所有信息。因此很容易撤消或重做它(可能会产生一些保持未封装在 Command 对象中的状态的开销)

这里有一些链接:

撤消/重做的命令模式

C#中的多级撤消/重做

于 2012-07-07T19:38:13.417 回答