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

C# 如何在编辑之前复制对象,然后根据需要替换已编辑的对象,c#,collections,deep-copy,object-model,C#,Collections,Deep Copy,Object Model,我正在编写一个C#WinForms应用程序,其中有一个表单可以编辑对象。表单有一个函数setObject(),用于将对象设置为私有字段,还有一个函数getObject()用于获取对象。我在调用窗体显示的对话框之前调用此函数 显示表单后,可以编辑对象的值。例如,集合中的项目可以修改 如果用户按下“取消”按钮,我不希望对象的更改保持不变 最好的编码方式是什么?是否应在显示表单之前复制对象,如果按下“取消”按钮,则替换已复制的对象以替换已编辑的表单对象 我正在考虑一种情况,即我要编辑集合中的对象。编辑

我正在编写一个
C#WinForms
应用程序,其中有一个表单可以编辑对象。表单有一个函数
setObject()
,用于将对象设置为私有字段,还有一个函数
getObject()
用于获取对象。我在调用窗体显示的对话框之前调用此函数

显示表单后,可以编辑对象的值。例如,
集合中的项目可以修改

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

最好的编码方式是什么?是否应在显示表单之前复制对象,如果按下“取消”按钮,则替换已复制的对象以替换已编辑的表单对象

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

下面是一些代码来说明:

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

public void simpleFunction()
{
    Simple2 obj = simple2Collecton.First();
    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);
    }
}
publicstatict克隆(此对象对象对象源)
{
如果(!typeof(T).IsSerializable)
{
抛出新ArgumentException(“类型必须可序列化。”,“源”);
}
if(Object.ReferenceEquals(objSource,null))
{
返回默认值(T);
}
使用(MemoryStream stream=new MemoryStream())
{
BinaryFormatter formatter=新的BinaryFormatter();
序列化(流,objSource);
流位置=0;
返回(T)格式化程序。反序列化(流);
}
}

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

以下是我用于此目的的方法

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
}
根据您的对象复制部分,对象复制将是一个问题,因为它们是引用类型,在找不到完全相同的引用之前,不会交换它们


为什么不在取消单击时放弃更改,而不是保存更改。它不会影响集合中的原始对象

你能给我举一个主实例和固定实例的例子吗?我对术语不太清楚。
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
}