8

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

4

4 回答 4

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
于 2010-02-03T22:27:06.173 回答
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);
        }
    }
于 2011-10-13T09:10:01.517 回答
1

如果我的源是 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;
        }

}

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

于 2011-10-13T08:53:21.987 回答
0

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

于 2008-10-19T21:10:15.000 回答