2013-03-15 7 views
7

Ich weiß, dass ich Linq verwenden kann, um Felder aus XML Feldern in einem bereits bestehenden Objekt zuzuordnen. Gibt es Funktionen in .NET Framework (oder anderen Bibliotheken), die dies weniger manuell machen?C# - Hydrate existierendes Objekt mit XML

würde ich schreiben (und haben die HydrateFromXml ein wenig verhalten sich wie AutoMapper tut):

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

myObject = myObject.HydrateFromXml(string xml); 

Edit:

Könnte ich das Decorator-Muster oder ein einfaches Wrapper-Objekt hier benutzen? Deserialisieren Sie direkt in einen Typ, der von einer Abstraktion umgeben ist, die die feinkörnige Konstruktion ermöglicht, die ich brauche?

+1

Ich habe etwas ähnliches markiert die Eigenschaften mit Serialisierungsattributen. Schreiben Sie dann eine Methode, die markierte Eigenschaften ausdrückt und dann in der XML-Datei nach dem Inhalt sucht, um sie zu setzen. Wenn man davon ausgeht, dass es kein Überkreuzen zwischen den Argumenten des Konstrukteurs und der Hydration gibt, dann sollte man darüber nachdenken. Verwenden Sie die Serialisierung, um die Argumente des Konstruktors zu erhalten. –

+0

Darf ich fragen, was "Hydrat" in diesem Zusammenhang bedeutet? –

+0

@KennethK. Ich denke, das ist der Kern des Problems. Ich möchte, dass die Eigenschaften von 'myObject' mit den entsprechenden Werten im XML initialisiert werden, dies bedeutet jedoch, dem Programm mitzuteilen, wie es zu tun ist. Ich suchte nach etwas, bei dem Felder nicht manuell zugeordnet werden mussten, aber es sieht so aus, als ob dies nicht möglich ist. – Ben

Antwort

5

Sie XmlSerializer das tun können:

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

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

var myObject = result as MyObject; 

Für eine Situation, wenn Sie Objektinstanz bereits sind, diese Frage existiert überprüfen: Deserializing properties into a pre-existing object

+0

Keine Notwendigkeit für das 'as' in der letzten Zeile - es wird immer nur ein' 'sein MyObject', so können Sie einfach casten. –

+2

Dies scheint meine Frage nicht zu beantworten, da 'result' den Deserialisierungsschritt nicht vorgibt. Ich möchte eine bereits vorhandene Objektinstanz hydratisieren. – Ben

+0

Sie haben also keine 'MyObject' Deklaration? – MarcinJuraszek

1

Als schnelle Option, könnten Sie AutoMapper verwenden. Verwenden Sie den XmlSerializer, um die Deserialisierung für eine neue Instanz durchzuführen, und verwenden Sie dann AutoMapper, um der neu erstellten Instanz die erforderliche Instanz zuzuordnen.