XML-сериализация перечислений как элементов с атрибутом - PullRequest
0 голосов
/ 04 января 2019

В моем проекте .NET я использую стандартную сериализацию XML .NET для генерации файлов XML для определенного стороннего кода. Это означает, что я не могу ничего изменить в макете файла XML.

У меня нет проблем с созданием атрибутов элемента XML со значениями, взятыми из перечисления, например,

enum BarType
{
    SimpleBar,
    ComplexBar
}

class Foo
{
    [XmlAttribute]
    public BarType BarType;
}

для создания

<Foo BarType="SimpleBar"/>

используя код типа

var foo = new Foo() { BarType = BarType.SimpleBar };

Однако это не то, чего мне нужно достичь. Есть ли простой способ генерирования вместо этого что-то вроде

<Foo>
     <BarType Type="SimpleBar" />
</Foo>

чтобы я мог использовать тот же простой код для установки BarType?

Пока у меня есть что-то вроде этого:

class Foo
{
     public EnumElementWithTypeAttribute<BarType> BarType;
}

с EnumElement, определенным как

class EnumElementWithTypeAttribute<T>
{
     [XmlAttribute]
     public T Type;
}

и затем создайте экземпляр Foo с этим уродливым кодом:

var foo = new Foo() { BarType = new EnumElementWithTypeAttribute<BarType>(BarType.SimpleBar) };

Это не только некрасиво, но так как у меня на самом деле много таких свойств, это довольно утомительно (это также причина для универсального). В идеале я хотел бы представить что-то вроде

class Foo
{
    [Something(ElementName:="BarType", AttributeName:="Type")]
    public BarType BarType;
}

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

Я не очень разбираюсь в глубинах сериализации XML и был бы признателен за любую помощь или предложение, как это упростить.

...