我正在尝试在 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;
}
}
当一个可以重做的动作开始时,就会创建一个新的动作。当我们到达新状态时,finish() 被调用。当用户想要重做某事时,它会调用reverse()并将对象恢复到其原始状态。
显然这不起作用,因为两个对象都是通过引用传递的,并且对象最终处于新状态。
我真正想做的是能够说:
public Action(object old)
{
old_state = old.MemberwiseClone();
}
不幸的是,这不起作用,我收到一个如下错误:
无法通过“foo.object”类型的限定符访问受保护成员“object.MemberwiseClone()”
我想创建原始状态的浅表副本(按值复制所有值字段,并按引用复制所有引用字段),但我不知道如何使用通用对象来执行此操作,而不是实现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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)