Наличие класса, обеспечивающего XmlElementName по умолчанию

У меня есть набор классов, которые я пытаюсь сериализовать как часть этой спецификации: http://open511.org/root.html

public class Link
{
    public Link()
    {

    }

    public Link(string url, string rel = "self")
    {
        Url = url;
        Rel = rel;
    }

    [XmlAttribute("rel")]
    public string Rel { get; set; }

    [XmlAttribute("href")]
    public string Url { get; set; }
}

а также

public class Service
{
    private Link _serviceTypeUrl;

    [XmlElement("link")]
    public Link ServiceTypeUrl
    {
        get { return _serviceTypeUrl; }
        set
        {
            _serviceTypeUrl = value;
            _serviceTypeUrl.Rel = "service_type";
        }
    }

    [XmlElement("link")]
    public Link Url { get; set; }

    [XmlArray("supported_versions")]
    [XmlArrayItem("supported_version")]
    public List<SupportedVersion> SupportedVersions { get; set; }
}

Это не позволит мне иметь два свойства с одним и тем же элементом XMLElement. Есть ли способ сделать это?

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

2 ответа

Решение

Похоже, что вы пытаетесь достичь не поддерживается. Ваши альтернативы:

  1. Используйте разные имена элементов для сериализации ваших атрибутов
  2. Используйте коллекцию для хранения всех ваших Links. В некоторых случаях это усложняет запрос данных, но, я думаю, даст вам нечто похожее на то, что вы хотите.

источники

Вдохновленный ответом FreeAsInBeer, я сохранил их в списке и написал специальную вставку, чтобы предотвратить повторную вставку.

public class Service
{
    private List<Link> _links;

    [XmlIgnore]
    public Link ServiceTypeUrl
    {
        get { return Links.FirstOrDefault(l => l.Rel == "service_type"); }
        set
        {
            var tempLink = value;
            tempLink.Rel = "service_type";
            Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
            Links.Add(tempLink);
        }
    }

    [XmlIgnore]
    public Link Url
    {
        get { return Links.FirstOrDefault(l => l.Rel == "self"); }
        set
        {
            var tempLink = value;
            tempLink.Rel = "self";
            Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
            Links.Add(tempLink);
        }
    }

    [XmlElement("link")]
    public List<Link> Links
    {
        get { return _links ?? (_links = new List<Link>()); }
        set { _links = value; }
    }

    [XmlArray("supported_versions")]
    [XmlArrayItem("supported_version")]
    public List<SupportedVersion> SupportedVersions { get; set; }
}
Другие вопросы по тегам