Qual è il modo migliore per clonare un oggetto business in Silverlight?
-
03-07-2019 - |
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?
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ò.