Func <out tresult =“”>怎么能返回Func <out tresult =“”>?</out> </out>

时间:2012-07-07 19:09:16

标签: c# .net generics

我正在玩一个undo-redo实现,我希望它的堆栈上的撤消或重做项目能够引用某些Func<out TResult> TResult本身就是Func<TResult> 1}}。关键是当从撤销堆栈调用Func时,返回值将存储在重做堆栈上(反之亦然)。

我不确定是否可以这样做。

我能想到的最好的东西不会像你在这里看到的那样工作:

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

2 个答案:

答案 0 :(得分:3)

正如您所发现的,让撤消Func直接返回重做Func不起作用,因为所需的类型参数将无限增长。你需要做的是引入一个间接级别,例如,通过让undo Func返回UndoRedoItem来放置在重做堆栈而不仅仅是重做Func:

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

答案 1 :(得分:3)

您应该调查命令模式以实现您想要的效果。

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

以下是一些链接:

Command pattern for undo / redo

Multilevel Undo / Redo in C#