Я пытаюсь написать метод, который использует отражение, чтобы получить свойства и установить их значение при обходе XElement:Импорт XML в объекты Рекурсивного
Допустит, у меня есть класс, как это которое только дает мне значение XML быть разобран:
class XMLController
{
public string XML
{
get{
return @"<FieldGroup name='People' count='20'>
<Fields>
<Field Name='Jon' LastName='McFly'/>
<Field Name='Michael' LastName='Jackson'/>
</Fields>
</FieldGroup>";
}
}
}
и это, как мои объекты выглядеть следующим образом:
class FieldGroup
{
public string Name {get;set;}
public string Count {get;set;}
public IEnumerable<Field> Fields {get;set;}
}
class Field
{
public string Name {get;set;}
public string LastName {get;set;}
}
метод картографа траверсы XElement
и с узлом Нама es соответствуют именам с объектами, о которых я думаю, это помогает немного больше, но я не придумал что-то действительно полезное. Я не хочу передавать тип, но метод будет работать почти с каждым XML, переданным в том же формате.
Все это знает, что узлы и атрибуты XML соответствуют именам.
Это то, что я сделал, но на самом деле не работал:
class XMLObjectMapper
{
public T Map<T>(XElement element) where T: class, new()
{
T entity = (T) Activator.CreateInstance(typeof(T));
if(element.HasAttributes)
{
MapXMLAttributesToObject<T>(element,entity);
}
if(element.HasElements)
{
foreach (var childElement in element.Elements())
{
//if the child element has child elements as well, we know this is a collection.
if(childElement.HasElements)
{
var property = GetProperty<T>(childElement.Name.LocalName);
property.SetValue(entity,new List<property.PropertyType>());
Map<T>(childElement);
}
else
{
var property = GetProperty<T>(childElement.Name.LocalName);
var type = Activator.CreateInstance(property.PropertyType);
type.Dump();
}
}
}
return entity;
}
private void MapXMLAttributesToObject<T>(XElement element, T entity)
{
foreach(XAttribute attribute in element.Attributes())
{
var property = GetProperty<T>(attribute.Name.LocalName);
property.SetValue(entity,attribute.Value);
}
}
private PropertyInfo GetProperty<T>(string propertyName)
{
return typeof(T).GetProperty(propertyName,BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
}
}
Что-то не так с 'XmlSerializer'? –
На самом деле я не даю гибкости, к которой я нуждаюсь. – Tarik