2013-03-15 6 views
7

So che posso usare Linq per mappare campi da XML a campi in un oggetto preesistente. Ci sono delle funzioni in .NET Framework (o altre librerie) che rendono questo meno manuale.C# - Idrate l'oggetto esistente con XML

vorrei scrivere (e hanno il HydrateFromXml si comportano un po 'come automapper fa):

var myObject = new MyObject(/*ctor args*/); 

myObject = myObject.HydrateFromXml(string xml); 

Edit:

Potrei usare il modello decoratore o un semplice oggetto wrapper qui? Deserializza direttamente in un tipo avvolto da un'astrazione che consente il controllo della struttura a grana fine di cui ho bisogno?

+1

Ho fatto qualcosa di simile con le proprietà di serializzazione con gli attributi di serializzazione. Quindi scrivi un metodo che rifletta le proprietà marcate e quindi scorri nel xml per il contenuto per impostarle. Dicendo che supponendo che non ci sia un crossover tra il costrutore args e l'idratazione, si tratta di rivederlo. Utilizzare la serializzazione per ottenerne una quindi impostare le arguemnts del costruttore? –

+0

Posso chiedere cosa significa "idratare" in questo contesto? –

+0

@KennethK. Penso che questo sia il punto cruciale del problema. Vorrei che le proprietà su 'myObject' inizializzassero con i valori corrispondenti nell'XML, ma farlo significa dire al programma come farlo. Stavo cercando qualcosa che non coinvolgesse manualmente i campi di mappatura, ma sembra che questo non sia possibile. – Ben

risposta

5

È possibile utilizzare XmlSerializer per farlo:

var serializer = new XmlSerializer(typeof(MyObject)); 

object result; 
using (TextReader reader = new StringReader(xml)) 
{ 
    result= serializer.Deserialize(reader); 
} 

var myObject = result as MyObject; 

Per una situazione in cui sei istanza di un oggetto esiste già verificare questa domanda: Deserializing properties into a pre-existing object

+0

Non c'è bisogno di 'as' nell'ultima riga - sarà sempre e solo un' MyObject', quindi puoi semplicemente trasmettere. –

+2

Questo non sembra rispondere alla mia domanda perché 'result' non pre-esiste il passo di deserializzazione. Vorrei idratare un'istanza di oggetto preesistente. – Ben

+0

Quindi non si ha la dichiarazione 'MyObject'? – MarcinJuraszek

1

Come un rapido opzione, è possibile utilizzare automapper. Utilizzare XmlSerializer per deserializzare in una nuova istanza e quindi utilizzare AutoMapper per eseguire il mapping dall'istanza appena creata all'istanza richiesta.