如何在编辑之前复制对象,然后在需要时替换已编辑的对象

时间:2016-02-23 05:47:42

标签: c# collections deep-copy object-model

我正在编写一个C# WinForms应用程序,我有一个表单来编辑对象。表单有一个函数setObject(),它将对象设置为私有字段,将函数getObject()设置为获取对象。我在调用表单显示的对话框之前调用了这个函数。

显示表单后,可以编辑对象的值。例如Collection<T>中的项目可以修改。

如果用户按下取消按钮,我不希望对象保持更改。

如何编写此代码的最佳方法?我应该在显示表单之前复制对象,如果按下取消按钮,替换复制的对象代替编辑的表单对象?

我正在考虑一种情况,我想编辑集合中的对象。在表单上编辑对象后,用户按下取消按钮。然后需要将复制的对象插回到集合中以代替编辑的对象。由于正在插入的对象现在是一个复制的对象,对旧对象的引用检查是否会出现问题?

以下是一些代码来说明:

public class Simple1
{
    public Collection<Simple2> simple2Collecton { get; set; }
}

public void simpleFunction()
{
    Simple2 obj = simple2Collecton.First();
    bool value = (obj == simple2Collecton.First());
}

如果我有Simple2对象引用simple2Collecton中的第一项,我在与编辑表单交互后复制Simple1对象。以下代码仍然是== true

bool value = (obj == simple2Collecton.First());

这是我目前复制/克隆对象的代码:

public static T Clone<T>(this object objSource)
{
    if (!typeof(T).IsSerializable)
    {
        throw new ArgumentException("The type must be serializable.", "source");
    }

    if (Object.ReferenceEquals(objSource, null))
    {
        return default(T);
    }
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, objSource);
        stream.Position = 0;
        return (T)formatter.Deserialize(stream);
    }
}

2 个答案:

答案 0 :(得分:0)

我建议您每次打开表单时都保存一个&#34;主要实例&#34; (用于编辑)和私人&#34;固定实例&#34;在编辑它之前,您的对象作为参考。之后,我将使用反射将固定实例复制到新的主实例中并将其绑定到表单。在GetObject()方法中,如果用户按下cancel键,则应始终返回主实例并在它们之间切换。

答案 1 :(得分:0)

这是我用于此目的的方法;

setData(Object)
{
//set object's values to form controls
}

OnEditBtn_Click(Sender,EventArgs)
{
//Iterate over your list and find the object by ID and call setData with 
//searched object
//setData(SearchedObjectToEdit); //It will set form controls with the object data
}
Cancel_Button_Click(Sender,EventArgs)
{
//create a new tempObj, instance of the object.
//call setData(tempObj), it will set the blank values to form controls,
//showing that changes has been reverted
}

OnSubmitBtn_Click(Sender, EventArgs)
{
 //iterate over your collection and replace the edited object when ID is found
}

根据您的对象复制部分,对象复制将是一个问题,因为它们是引用类型,并且在找不到完全相同的引用之前不会进行交换。

为什么不放弃对cancelBtnClick的更改而不是保存它们。它不会影响Collection中的原始对象。