让一个类提供默认的XmlElementName

本文关键字:默认 XmlElementName 一个 | 更新日期: 2023-09-27 18:18:28

我有一组类,我试图序列化作为本规范的一部分: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的属性。有办法做到这一点吗?

我本来希望link类指定它总是使用元素名"link"

让一个类提供默认的XmlElementName

看起来您想要实现的目标不被支持。你的选择是:

  1. 使用不同的元素名序列化属性
  2. 使用集合来保存所有的Link。这使得查询数据变得困难在某些情况下,但我相信会给你类似你想要的东西。

  • 所以回答1
  • 所以答案2

受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; }
}