Domanda

Qual è il modo migliore per creare un clone di un DTO? Non esiste un'interfaccia ICloneable o una classe BinaryFormatter in Silverlight. La riflessione è l'unico modo?

È stato utile?

Soluzione

Ecco il codice che abbiamo creato per la clonazione. Funziona con Silverlight 2 & amp; 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

Altri suggerimenti

ICloneable non è disponibile in Silverlight 4 (non so circa 1/2/3 o versione successiva). Viene rimosso dalle API pubbliche di Silverlight 4. Aiuto dal codice di Mike Schall; sta funzionando per me.

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

Come creare un clone se la mia fonte è IEnumerable. Questo LayerDto ha anche un tipo di oggetto (ad esempio MetaItemDto).

Codice:

LayerDto di classe pubblica { }
classe pubblica MetaItemDtoList: System.Collections.ObjectModel.ObservableCollection { }

Clone IEnumerable statico pubblico (sorgente 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;
        }

}

ma il problema che sto affrontando è che il layer non mostra i suoi metaItem (per ogni layer).

Credo che la funzionalità di clonazione standard sia stata lasciata fuori per mantenerla semplice e leggera. Credo che potresti usare la serializzazione JSON o XML per ottenere lo stesso risultato. Non sono sicuro dei costi delle prestazioni però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top