Я кодирую приложение 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);
}
}
Не могли бы вы привести пример основного экземпляра и фиксированного экземпляра? Я не уверен в терминологии. – user3736648