创建DTO克隆的最佳方法是什么? Silverlight中没有ICloneable接口或BinaryFormatter类。反思是唯一的方式吗?
答案 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序列化来实现同样的目的。但不确定性能成本。