2013-03-15 3 views
7

Я знаю, что я могу использовать Linq для сопоставления полей из XML в поля в ранее существовавшем объекте. Существуют ли какие-либо функции в .NET Framework (или других библиотеках), которые делают это менее ручным.C# - Гидрат существующего объекта с XML

Я хотел бы написать (и есть HydrateFromXml себя немного как AutoMapper делает):

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

myObject = myObject.HydrateFromXml(string xml); 

Edit:

Могу ли я использовать шаблон декоратора или простой объект обертку здесь? Удалить десериализацию непосредственно в тип, который обернут абстракцией, которая позволяет мелкозернистый контроль конструкции, в котором я нуждаюсь?

+1

Я сделал несколько похожих признаков свойств с атрибутами сериализации. Затем напишите метод, который отражает выделенные свойства, а затем выкопайте в xml для содержимого, чтобы установить их. Говоря о том, что, если между конструкторами и гидратацией нет никакого перекрестка, о том, чтобы воссоздать его. Использовать сериализацию, чтобы получить один, затем установить аргументы конструктора? –

+0

Могу ли я узнать, что означает «гидрат» в этом контексте? –

+0

@ KennethK. Я думаю, что это проблема проблемы. Я хотел бы, чтобы свойства на 'myObject' были инициализированы с соответствующими значениями в XML, но это означает, что программа сообщает, как это сделать. Я искал что-то, что не связано с полями сопоставления вручную, но похоже, что это невозможно. – Ben

ответ

5

Вы можете использовать XmlSerializer сделать:

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

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

var myObject = result as MyObject; 

Для ситуации, когда вы экземпляр объекта уже существует проверить этот вопрос: Deserializing properties into a pre-existing object

+0

Нет необходимости в 'as' в последней строке - это будет только когда-либо' MyObject', поэтому вы можете просто бросить. –

+2

Это, похоже, не отвечает на мой вопрос, потому что 'result' не предшествует шагу десериализации. Я хотел бы увлажнить ранее существовавший объект. – Ben

+0

Значит, у вас нет декларации MyObject? – MarcinJuraszek

1

как быстрый вариант, вы можете использовать AutoMapper. Используйте XmlSerializer для десериализации в новый экземпляр, а затем используйте AutoMapper для сопоставления из вновь созданного экземпляра в требуемый экземпляр.

Смежные вопросы