Как мне клонировать предка в c #? - PullRequest
1 голос
/ 25 июля 2011

Мне нужна полумелая копия объекта.Под моим первоначальным дизайном я использовал MemberwiseClone, чтобы поймать все простые вещи, а затем я специально скопировал классы в той степени, в которой их нужно было копировать.(Некоторые из них по своей природе статичны, а большинство - контейнеры со статическими элементами.) Мне не понравился длинный список копий, но нет никакого пути к этому.чтобы создать дочерний объект - теперь мне нужно вернуться назад и скопировать все те поля, которые ранее я копировал с MemberwiseClone?

Или мне не хватает лучшего обходного пути для этого?

1 Ответ

4 голосов
/ 25 июля 2011

Я считаю, что самый простой способ клонирования - использовать сериализацию. Это, очевидно, работает только с классами [Serializable] или реализующими ISerializable.

Вот общее универсальное расширение, которое можно использовать для клонирования объектов любого сериализуемого класса:

public static T Clone<T>(this T source)
{
    if (source == default(T))
    {
        return default(T);
    } else {
        IFormatter formatter = new BinaryFormatter();
        Stream ms = new MemoryStream();
        using (ms)
        {
            formatter.Serialize(ms, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T) formatter.Deserialize(ms);
        }
    }
}
...