Я не думаю, что XmlNode
- хороший класс для этой цели.Во-первых, для создания XmlNode требуется, чтобы вы передали ему XmlDocument, что не является хорошим решением .
Во-вторых, атрибуты и значения свойств могут быть извлечены из LINQ, и я думаю,может хорошо интегрироваться с LINQ to XML (и, в частности, XElement
класс).
Я написал некоторый код, который делает это:
using System;
using System.Linq;
using System.Xml.Linq;
[AttributeUsage(AttributeTargets.Property)]
class PropertyAttribute : Attribute { }
class BaseClass
{
[Property]
public int Id { get; set; }
IEnumerable<XElement> PropertyValues {
get {
return from prop in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
where prop.GetGetMethod () != null
let attr = prop.GetCustomAttributes(typeof(PropertyAttribute), false)
.OfType<PropertyAttribute>()
.SingleOrDefault()
where attr != null
let value = Convert.ToString (prop.GetValue(this, null))
select new XElement ("field",
new XAttribute ("name", prop.Name),
new XAttribute ("value", value ?? "null")
);
}
}
public XElement ToXml ()
{
return new XElement ("class",
new XAttribute ("name", GetType ().Name),
PropertyValues
);
}
}
class DerivedClass : BaseClass
{
[Property]
public string Name { get; set; }
}
public static class Program
{
public static void Main()
{
var instance = new DerivedClass { Id = 42, Name = "Johnny" };
Console.WriteLine (instance.ToXml ());
}
}
Это выводит следующий XML на консоль:
<class name="DerivedClass">
<field name="Name" value="Johnny" />
<field name="Id" value="42" />
</class>