8

DTO のクローンを作成する最良の方法は何ですか? Silverlight には、ICloneable インターフェイスや BinaryFormatter クラスはありません。反射だけが唯一の方法ですか?

4

4 に答える 4

9

これが私たちがクローン作成のために思いついたコードです。これは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
于 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など)もあります。

コード:

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を表示しないことです。

于 2011-10-13T08:53:21.987 に答える
0

シンプルで軽量に保つために、標準のクローン作成機能は省略されていると思います。ただし、JSON または XML シリアライゼーションを使用して同じことを達成できると思います。ただし、パフォーマンスコストについてはわかりません。

于 2008-10-19T21:10:15.000 に答える