DTO のクローンを作成する最良の方法は何ですか? Silverlight には、ICloneable インターフェイスや BinaryFormatter クラスはありません。反射だけが唯一の方法ですか?
4 に答える
これが私たちがクローン作成のために思いついたコードです。これはSilverlight2および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
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);
}
}
ソースがIEnumerableの場合にクローンを作成する方法。このLayerDtoには、いくつかのオブジェクトタイプ(MetaItemDtoなど)もあります。
コード:
public class LayerDto {}
public class 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を表示しないことです。
シンプルで軽量に保つために、標準のクローン作成機能は省略されていると思います。ただし、JSON または XML シリアライゼーションを使用して同じことを達成できると思います。ただし、パフォーマンスコストについてはわかりません。