2013-03-15 10 views
7

Wiem, że mogę użyć Linq do odwzorowania pól z XML na pola w istniejącym wcześniej obiekcie. Czy są jakieś funkcje w .NET Framework (lub innych bibliotekach), które sprawiają, że jest to mniej ręczne.C# - Hydratowanie istniejącego obiektu za pomocą XML

chciałbym napisać (i mieć HydrateFromXml zachowują się trochę jak AutoMapper robi):

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

myObject = myObject.HydrateFromXml(string xml); 

Edit:

Czy mogę użyć deseniu dekorator lub prosty wrapper obiektu tutaj? Deserializować bezpośrednio do typu, który jest opakowany przez abstrakcję, która pozwala na precyzyjne sterowanie konstrukcją, którego potrzebuję?

+1

Zrobiłem coś podobnego markowe właściwości z atrybutami serializacji. Następnie napisz metodę, która odzwierciedla zaznaczone właściwości, a następnie kopiuj w xml dla zawartości, aby je ustawić. Mówiąc, że zakładając, że nie ma skrzyżowania między argumentami konstr. I Hydration, nie wahajcie się, jak to zrobić. Użyj serializacji, aby uzyskać, a następnie ustawić argumenty konstruktora? –

+0

Czy mogę zapytać, co oznacza "hydrat" w tym kontekście? –

+0

@KennethK. Myślę, że to jest sedno problemu. Chciałbym, aby właściwości na 'myObject' były inicjalizowane z odpowiednimi wartościami w XML, ale oznacza to, mówiąc programowi, jak to zrobić. Szukałem czegoś, co nie wymagało ręcznego mapowania pól, ale wygląda na to, że nie jest to możliwe. – Ben

Odpowiedz

5

Można użyć XmlSerializer to zrobić:

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

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

var myObject = result as MyObject; 

Dla sytuacji, kiedy jesteś instancja obiektu już istnieje sprawdzić to pytanie: Deserializing properties into a pre-existing object

+0

Nie ma potrzeby używania "as" w ostatniej linii - to zawsze będzie ". MyObject', więc możesz po prostu rzucić. –

+2

Nie wydaje się, aby odpowiedzieć na moje pytanie, ponieważ 'result' nie istnieje wcześniej etapie deserializacji. Chciałbym nawodnić istniejącą instancję obiektu. – Ben

+0

Więc nie masz w ogóle deklaracji "MyObject'? – MarcinJuraszek

1

jako szybki opcji, można użyć AutoMapper. Użyj XmlSerializer do deserializacji do nowej instancji, a następnie użyj AutoMappera do odwzorowania nowo utworzonej instancji na wymaganą instancję.

Powiązane problemy