Копирование (клонирование) объектов в C#

21.01.2011 18:08 / Артём Волк / 2150 просмотров / ...

В .NET, как выяснилось, нет встроенной возможности получить копию объекта. Один из способов — использование сериализации.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace CrispStudio.Routine.Clone
{
	public static class ObjectCloner
	{
		public static T DeepClone<T>(T source) where T : class
		{
			MemoryStream stream = new MemoryStream();
			BinaryFormatter formatter = new BinaryFormatter();
			formatter.Serialize(stream, source);
			stream.Position = 0;
			return (T)formatter.Deserialize(stream);
		} 
	}
}

Пример использования:

SomeCustomClass objectCopy = ObjectCloner.DeepClone(objectSource);

Минус решения: используется сериализация, значит объект должен быть сериализуемым (и должен иметь аттрибут [Serializable]).

Способ найден в Google-группе AutoMapper'a и, как подсказали в ответах, переделан на использование generic'ов.