gpt4 book ai didi

c# - 使用 MemberwiseClone 实现撤销/重做

转载 作者:行者123 更新时间:2023-11-30 12:36:31 25 4
gpt4 key购买 nike

我试图在我正在处理的 C# 应用程序中实现撤消/重做堆栈,方法是在调用撤消时将对象恢复到之前的状态。我有一个基本上像这样的“ 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;
}
}

当开始一个可以重做的 Action 时,一个新的 Action 被创建。当我们到达新状态时,调用 finish()。当用户想要重做某事时,它会调用 reverse() 并将对象恢复到其原始状态。

显然这是行不通的,因为两个对象都是通过引用传递的,并且对象只是以新状态结束。

我真正想做的是能够说:

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;
}

关于c# - 使用 MemberwiseClone 实现撤销/重做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com