c# XML 序列化 - 动态元素名称

c# XML serialization - dynamic element name

我当前的XML结构是:

<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <Child>
   <Line id="1">Something else</Line>
   <Line id="2">Something else</Line>
 </Child>
</Parent>

Parent class 代码包含 属性:

[XmlElement("Child")]
public List<Child> Childrens { get; set; }

现在我想把它改成:

<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <SpecialChild>
   <Line id="1">Some other text</Line>
   <Line id="2">Some other text</Line>
 </SpecialChild>
</Parent>

即当 Child 设置了一些特殊标志时,应该更改它的名称,并打印一些其他文本。 Child 已经知道根据标志打印什么文本。

但是现在更改元素名称的最佳选择是什么?

认为你应该能够为此使用继承:

[XmlElement("Child", typeof(Child))]
[XmlElement("SpecialChild", typeof(SpecialChild))]
public List<Child> Childrens { get; set; }

public class SpecialChild : Child {...}

但是:如果没有继承,它本身不受支持,您需要执行手动序列化。


编辑:确认,工作正常:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
class Program
{    static void Main()
    {
        var ser = new XmlSerializer(typeof(Parent));
        var obj = new Parent
        {
            Childrens = {
                new Child { },
                new SpecialChild { },
            }
        };
        ser.Serialize(Console.Out, obj);
    }
}
public class Parent
{
    [XmlElement("Child", typeof(Child))]
    [XmlElement("SpecialChild", typeof(SpecialChild))]
    public List<Child> Childrens { get; } = new List<Child>();
}
public class Child { }
public class SpecialChild : Child { }