Как лучше всего клонировать бизнес-объект в Silverlight? - PullRequest
8 голосов
/ 15 октября 2008

Каков наилучший способ создания клона DTO? В Silverlight нет интерфейса ICloneable или класса BinaryFormatter. Является ли отражение единственным способом?

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

Вот код, который мы придумали для клонирования. Это работает в Silverlight 2 и 3.

Public Shared Function Clone(Of T)(ByVal source As T) As T
    Dim serializer As New DataContractSerializer(GetType(T))
    Using ms As New MemoryStream
        serializer.WriteObject(ms, source)
        ms.Seek(0, SeekOrigin.Begin)
        Return DirectCast(serializer.ReadObject(ms), T)
    End Using
End Function
3 голосов
/ 13 октября 2011

ICloneable недоступен в Silverlight 4 (я не знаю о 1/2/3 или следующей версии). Он удален из общедоступных API-интерфейсов Silverlight 4. Помощь от кода Майка Шалла; это работает для меня.

public LayerDto Clone(LayerDto source)
    {

        DataContractSerializer serializer = new DataContractSerializer(typeof(LayerDto));
        using (MemoryStream ms = new MemoryStream())
        {
            serializer.WriteObject(ms, source);
            ms.Seek(0, SeekOrigin.Begin);
            return (LayerDto)serializer.ReadObject(ms);
        }
    }
1 голос
/ 13 октября 2011

Как создать клон, если мой источник IEnumerable. Этот LayerDto также имеет некоторый тип объекта (например, MetaItemDto).

Код:

открытый класс LayerDto { }
открытый класс MetaItemDtoList: System.Collections.ObjectModel.ObservableCollection { }

общедоступный статический клон IEnumerable (источник IEnumerable)

{

        IEnumerable<LayerDto> layers;

        DataContractSerializer serializer = new DataContractSerializer(typeof(IEnumerable<LayerDto>));
        using (MemoryStream ms = new MemoryStream())
        {
            serializer.WriteObject(ms, source);
            ms.Seek(0, SeekOrigin.Begin);
            //return (IEnumerable<LayerDto>)serializer.ReadObject(ms);
            layers = (IEnumerable<LayerDto>)serializer.ReadObject(ms);
            return layers;
        }

}

но проблема, с которой я сталкиваюсь, состоит в том, что слой не показывает свои мета-элементы (для каждого слоя).

0 голосов
/ 20 октября 2008

Я считаю, что стандартная функциональность клонирования была упущена, чтобы сделать ее простой и легкой. Я полагаю, что вы можете использовать сериализацию JSON или XML, чтобы достичь того же. Не уверен насчет затрат на производительность, хотя.

...