2013-02-02 7 views
2

У меня есть список объектов, скажем List<Bar> barlist. Эти Bar orbjects довольно сложны, и я был бы счастлив продолжить без глубокого копирования.Нужна ли мне глубокая копия?

Однако я хотел бы разрешить пользователю изменять их, используя BindingSource, BindingNavigator и DataGridView. Однако, если я установил DataSource в свой список и изменил значения, BindingSource изменяет мой список (поскольку он, по-видимому, не имеет собственного списка или использует только мелкие копии).

Проблема с этим: что, если пользователь хочет отказаться от своих изменений? Я должен был бы вернуть их вручную или не применять их к исходному списку, если я дам BindingSource список с глубоким копированием. Однако я бы хотел избежать глубокого копирования.

Есть ли альтернативный путь? Или у меня нет выбора, кроме как пометить объекты как Serializable и скопировать их?

+0

я не достаточно ясно на вашей проблеме, чтобы опубликовать реальный ответ, но вы рассмотрели один- . Если это не сработает, я бы посмотрел на валютных менеджеров. Я не думаю, что это поможет. Вы, скорее всего, застряли, делая глубокую копию. –

+0

@PhillipScottGivens односторонняя привязка звучит интересно. Я предполагаю, что это помешает bindSource изменить мои данные. Однако я не думаю, что WinForms разрешает это (поскольку вы МОЖЕТЕ модифицировать данные, однако я не хочу применять эти изменения напрямую). Кажется, что все ведет к использованию глубокой копии. – CBenni

+0

@Kiquenet Я просто использовал глубокую копию. Я отправлю код в качестве ответа. (Я не беру кредит на код, это, по сути, код, который был опубликован на SO некоторое время назад. Кроме того, он работает только для сериализуемых объектов) – CBenni

ответ

2

Для записи я использовал следующую функцию глубокого клонирования для решения проблемы. Это может быть не самым хорошим решением, но это было достаточно и работает просто отлично (Eventhough только для Serializable объектов)

// Creates a deep copy of an Object 
public static T DeepClone<T>(T obj) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, obj); 
     ms.Position = 0; 

     return (T)formatter.Deserialize(ms); 
    } 
} 
1

Я бы предложил использовать Memento Pattern.

Вам необходимо создать отдельный объект, который может восстановить состояние каждого бара до того, как он начнет редактирование. Обычно это проще и дешевле, чем глубокая копия.

+3

Mementos по-прежнему необходимо клонировать данные, хранящиеся в качестве исходного состояния, если это объект а не неизменный тип. –

+0

Правда, но некоторые данные объекта могут быть неактуальными или могут быть восстановлены с использованием других методов (например, методов в объекте Bar). В тех случаях Memento все же лучше, чем глубокая копия. – Strillo

+0

Это может сработать, но все же я должен будет сохранить весь список хотя бы один раз. В противном случае данные не могут быть загружены/восстановлены без больших усилий. Тогда я буду использовать глубокие копии. – CBenni

Смежные вопросы