Одна очевидная особенность - это дженерики, реализация универсального сувенира позволит вам использовать его для любого объекта, который вы хотите.
Многие примеры, которые вы увидите, будут использовать строку (включая все те, которые в настоящее время входят в число ответов на этот вопрос) в качестве состояния, что является проблемой, поскольку это один из немногих типов в .NET, которые неизменны.
При работе с изменяемыми объектами (как и любой ссылочный тип со свойством setter-свойства) вы должны помнить, что при сохранении памятки вам необходимо создать глубокую копию объекта.В противном случае, когда вы меняете свой оригинальный объект, вы меняете свой сувенир.
Вы можете сделать это, используя сериализатор, такой как protobuf-net или json.net , поскольку они не требуют, чтобы вы отмечали ваши объекты сериализуемым атрибутом, таким какОбычный механизм сериализации .net делает.
В Codeproject есть несколько статей о реализациях универсального сувенира, но они, как правило, пропускают часть глубокой копии:
Универсальный шаблон мементо для Undo-Redo в C #
Шаблон дизайна сувенира