Десериализация XML в обобщенный c класс с атрибутом XmlElement - PullRequest
0 голосов
/ 12 марта 2020

У меня есть XML файл, который может содержать различные известные типы объектов. Чтобы упростить поддержку кода, я надеялся использовать для этого дженерики, но, поскольку мне нужно ввести имя элемента XML в атрибут [XmlElement], я столкнулся с проблемой, поскольку атрибуты обычно не хорошо играть с дженериками.

Это два XML примера:

<xml xmlns:so="http://some.schema">
  <so:myType>
    <value>42</value>
    <description>foo</description>
  </so:myType>
</xml>

<xml xmlns:so="http://some.schema">
  <so:myOtherType>
    <details>
      <code>47</code>
      <value>bar</code>
    </details>
  </so:myOtherType>
</xml>

И их соответствующие классы:

[XmlElement(ElementName = "myType", Namespace = "http://some.schema")]
public class myType {
  public int value { get; set; }
  public string description { get; set; }
}

[XmlElement(ElementName = "myOtherType", Namespace = "http://some.schema")]
public class myOtherType {
  public myOtherTypeDetails details { get; set; }

  public class myOtherTypeDetails {
    public int code { get; set; }
    public string value { get; set; }
  }
}

Теперь я надеялся, что смогу создать некоторый обобщенный c класс и использовать с атрибутом [XmlElement], вроде как:

public class GenericType<T> {
  [XmlElement(ElementName = typeof(T).Name, Namespace = "http://some.schema")]
  public T InnerType { get; set; }
}

И использовать его так:

GenericType<myOtherType> = XmlSerializer.Deserialize(xml);

Но это, очевидно, не работать, потому что атрибуты не могут использовать параметры типа, хотя я видел примеры [SomeAttribute(typeof(Foo))], который, кажется, противоречит этому.

Есть ли способ достичь такого рода "automati c" XML синтаксический анализ на основе обобщенных c типов?

...