Как клонировать предка в С#?

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

Однако теперь мне нужно создать объект-потомок — нужно ли мне теперь возвращаться и копировать все те поля, которые я ранее копировал с помощью MemberwiseClone?

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


person Loren Pechtel    schedule 25.07.2011    source источник
comment
Не хочу быть бесполезным, но что именно вы пытаетесь сделать?   -  person Esteban Araya    schedule 25.07.2011
comment
Возможно, стоит взглянуть и здесь stackoverflow.com/questions/9885644/   -  person Yury Schkatula    schedule 27.10.2015


Ответы (1)


Я считаю, что самый простой способ клонирования — использовать сериализацию. Это, очевидно, работает только с классами, которые являются [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);
        }
    }
}
person Roy Dictus    schedule 25.07.2011
comment
Похоже, это сделает работу. Я просто застрял в коробке. - person Loren Pechtel; 25.07.2011