c# – 使用MemberwiseClone实现撤消/重做

我正在尝试在C#应用程序中实现一个Undo / Redo堆栈,我正在通过在调用undo时将Object恢复到先前的状态来实现.我有一个’Action’类,看起来基本上是这样的:

class Action
{
    object old_state;
    object new_state;

    public Action(object old)
    {
        old_state = old;
    }

    public void finish(object new_obj)
    {
        new_state = new_obj;
    }

    public void reverse()
    {
        new_state = old_state;
    }
}

当启动可以重做的操作时,将创建一个新操作.当我们到达新状态时,调用finish().当用户想要重做某些东西时,它会调用reverse()并将Object恢复到其原始状态.

显然这不起作用,因为两个对象都是通过引用传递的,并且对象最终处于新状态.

我真正想做的是能够说:

public Action(object old)
{
    old_state = old.MemberwiseClone();
}

不幸的是,这不起作用,我得到一个错误,看起来像:

Cannot access protected member ‘object.MemberwiseClone()’ via a qualifier of type ‘foo.object’

我想创建原始状态的浅表副本(按值复制所有值字段和按引用复制所有引用字段),但我无法弄清楚如何使用通用对象执行此操作,而不是实现IClonable在我可能希望恢复国家的每个阶级.

有人可以提供任何见解吗?

最佳答案 您可以使用此版本的克隆对象(注意:对象必须是可序列化的才能使用此函数):

  /// <summary>
  /// Clones Any Object.
  /// </summary>
  /// <param name="objectToClone">The object to clone.</param>
  /// <return>The Clone</returns>
  public static T Clone<T>(T objectToClone)
  {
     T cloned_obj = default(T);
     if ((!Object.ReferenceEquals(objectToClone, null)) && (typeof(T).IsSerializable))
     {
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bin_formatter = null;
        Byte[] obj_bytes = null;

        using (MemoryStream memory_stream = new MemoryStream(1000))
        {
           bin_formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
           try
           {
              bin_formatter.Serialize(memory_stream, objectToClone);
           }
           catch (Exception) { }
           obj_bytes = memory_stream.ToArray();
        }

        using (MemoryStream memory_stream = new MemoryStream(obj_bytes))
        {
           try
           {
              cloned_obj = (T)bin_formatter.Deserialize(memory_stream);
           }
           catch (Exception) { }
        }
     }
     return cloned_obj;
  }
点赞