在Silverlight中克隆业务对象的最佳方法是什么?

时间:2008-10-14 20:38:56

标签: silverlight-2.0 clone

创建DTO克隆的最佳方法是什么? Silverlight中没有ICloneable接口或BinaryFormatter类。反思是唯一的方式吗?

4 个答案:

答案 0 :(得分:9)

以下是我们为克隆提出的代码。这适用于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

答案 1 :(得分:3)

ICloneable在Silverlight 4中不可用(我不知道1/2/3或即将推出的版本)。它已从Silverlight 4的公共API中删除。 来自Mike Schall代码的帮助;它对我有用。

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);
        }
    }

答案 2 :(得分:1)

如果我的源是IEnumerable,如何创建克隆。这个LayerDto也有一些对象类型(例如MetaItemDto)。

代码:

公共类LayerDto { }
公共类MetaItemDtoList:System.Collections.ObjectModel.ObservableCollection { }

public static IEnumerable Clone(IEnumerable source)

{

        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;
        }

}

但是我面临的问题是该层没有显示它的metaItems(对于每一层)。

答案 3 :(得分:0)

我认为标准克隆功能被遗漏以保持简单和轻量级。我相信你可以使用JSON或XML序列化来实现同样的目的。但不确定性能成本。