Здравствуйте!
Я пробую написать мульти-буфер обмена для курсовой. Он работает по следующему принципу: нажимаем Ctrl+C, копируем любой объект в системный буфер (Clipboard), далее с помощью Clipboard.GetDataObject () получаем скопированный объект, и кладем его в массив внутри синглтона (DataObject [] myBuffer). Код:
public void SetData (DataObject data, int index) {
myBuffer [index] = data; }
Обнаружил следующую проблему: все объекты в C# передаются по ссылке, по этому при заполнении моего буфера новым элементом все старые (которые я записал до этого) заменяются на новый добавленный элемент. По сути задача состоит в том, чтобы передать объект Clipboard.GetDataObject() в моей метод SetData по значению, а не по ссылке. Пробовал реализовать интерфейс IClonable для DataObject, но ничего не получилось. Подскажите пожалуйста методы для решения моей проблемы. Заранее спасибо!
Попробуйте MemberwiseClone, он клонирует рекурсивно объект, соответственно вы имеете не ссылку на объект, а новый объект.
Надеюсь я правильно понял ваш вопрос =)
Но проверьте, у меня есть сомнения что если у копируемого объекта внутри будет ссылка на другой объект то это не сработает.
Спасибо за ответ! Для того, чтобы использовать MemberwiseClone, нужно, чтобы в классе был имплементирован интерфейс IClonable, а в DataObject, к сожалению, этого нет.
Или сериализация, клонирует объект целиком. Может выкинуть исключение.
Если ее делать, то надо сначала сохранять весь объект в память, и только после этого передавать куда либо. Т.к. возможность сериализации всех включенных в объект типов не проверяется до запуска.