Вот, я дал вам это далеко:
< ?xml version="1.0"?>
< MyList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
< MyTypeBase />
< MySubType>something</ MySubType>
< MyTypeBase />
< MyTypeBase />
< MyOtherSubType>something</ MyOtherSubType>
< MyTypeBase />
< MyTypeBase />
< MySubType>something</ MySubType>
< MyTypeBase />
< MyTypeBase />
< MyOtherSubType>something</ MyOtherSubType>
< MyTypeBase />
< MyTypeBase />
< MySubType>something</ MySubType>
< MyTypeBase />
</ MyList >
(Я понятия не имею, как вставить XML на этот взорванный сайт.
Программа класса
{
static void Main (строка [] args)
{
MyList tmp = new MyList ();
tmp.Add(new MySubType());
tmp.Add(new MyOtherSubType());
tmp.Add(new MySubType());
tmp.Add(new MyOtherSubType());
tmp.Add(new MySubType());
XmlSerializer xs = new XmlSerializer(typeof(MyList));
MemoryStream ms = new MemoryStream();
xs.Serialize(ms, tmp);
ms.Seek(0, SeekOrigin.Begin);
TextReader tr = new StreamReader(ms);
string xt = tr.ReadToEnd();
}
}
[XmlRoot(ElementName="MyList")]
public class MyList : List<MyTypeBase> { }
[XmlInclude(typeof(MySubType))]
public class MyTypeBase : IXmlSerializable
{
public int ID { get; set; }
protected virtual Type elType { get { return typeof(MyTypeBase); } }
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteEndElement();
writer.WriteStartElement(elType.Name);
writer.WriteValue("something");
writer.WriteEndElement();
writer.WriteStartElement("MyTypeBase");
}
}
public class MySubType : MyTypeBase, IXmlSerializable
{
public string Name { get; set; }
protected override Type elType { get { return typeof(MySubType); } }
}
public class MyOtherSubType : MyTypeBase, IXmlSerializable
{
public string Name { get; set; }
protected override Type elType { get { return typeof(MyOtherSubType); } }
}
Код создает требуемый список, но с дополнительными элементами MtTypeBase, которые вы можете найти самостоятельно. Все, что он делает, меняет способ сериализации базового класса. Каждый подкласс меняет тип elType на свой собственный тип класса, поэтому базовый класс может использовать его для своей цели. Я уже потратил кучу времени на это, чтобы вы могли принять это здесь. Множество способов улучшить это, сделать его лучше и чище.