1

我使用 XML 文件和 XmlReader 来填充类对象。

这是我的类对象:

public class WikiMeta
{
    string _subject;

    public List<WikiArticle> Articles = new List<WikiArticle>();

    public List<WikiGroup> Groups = new List<WikiGroup>();

    public string PageMetaDescription { get; set; }

    public string PageTitle { get; set; }

    public string Route { get; set; }

    public string Subject { get; set; }
}

这是一个 XML 示例:

<AllMeta>
  <WikiMeta>
    <Subject>The Subject</Subject>
    <PageTitle>Page title</PageTitle>
    <PageMetaDescription>Page meta description</PageMetaDescription>
    <Articles>
      <WikiArticle>
        <FileName>file.txt</FileName>
      </WikiArticle>
    </Articles>
    <Groups>
      <WikiGroup>
        <Name>Main group</Name>
      </WikiGroup>
      <WikiGroup>
        <Name>Secondary group</Name>
      </WikiGroup>
    </Groups>
  </WikiMeta>
</AllMeta>

使用 XmlReader 类,XML 会自动映射到我的类属性,但是,我现在想介绍文章类型的变体。对我来说,两个明显的解决方案是:

  1. 用 2 个新组 PeerGroup 和 ChildGroup 替换 WikiGroup
  2. 在 WikiGroup 中添加一个 Type 元素

但是,我想知道是否有一种方法可以将属性添加到 WikiGroup 并将其映射到我的类中的两个不同属性,如下所示:

WikiGroup attr="peer">
        <Name>Main group</Name>
      </WikiGroup>

[XmlAttribute("peer")]
public WikiGroup PeerGroup { get; set; }

[XmlAttribute("child")]
public WikiGroup ChildGroup { get; set; }

我不知道这是否可能,但任何建议将不胜感激。

4

1 回答 1

0

假设您想要:

<Groups>
  <WikiGroup type="peer">
    <Name>Main group</Name>
  </WikiGroup>
  <WikiGroup type="child">
    <Name>Secondary group</Name>
  </WikiGroup>
</Groups>

正如您已经说过的,您应该将该Type属性添加到您的课程中:WikiGroup

public partial class WikiGroup
{
    public string Name { get; set; }
    [System.Xml.Serialization.XmlAttributeAttribute("type")]
    public string Type { get; set; }
}

WikiMeta类中,您可以添加 2 个属性:

[XmlIgnore]
public WikiGroup PeerGroup
{
    get
    {
        return groupsField.FirstOrDefault(g => g.Type== "peer");
    }
    set
    {
        if (groupsField == null)
            groupsField = new List<WikiGroup>();
        var peerGroup = groupsField.FirstOrDefault(g => g.Type == "peer");
        if (peerGroup != null)
            groupsField.Remove(peerGroup);
        value.Type = "peer";
        groupsField.Add(value);
    }
}

[XmlIgnore]
public WikiGroup ChildGroup
{
    get
    {
        return groupsField.FirstOrDefault(g => g.Type == "child");
    }
    set
    {
        if (groupsField == null)
            groupsField = new List<WikiGroup>();
        var childGroup = groupsField.FirstOrDefault(g => g.Type == "child");
        if (childGroup != null)
            groupsField.Remove(childGroup);
        value.Type = "child";
        groupsField.Add(value);
    }
}

除了新添加的属性之外,您还必须注意Groupssetter:

private List<WikiGroup> groupsField;

public List<WikiGroup> Groups
{
    get
    {
        return this.groupsField;
    }
    set
    {
        if (value.FirstOrDefault(g => g.Type == "peer") == null && PeerGroup != null)
            value.Add(PeerGroup);
        if (value.FirstOrDefault(g => g.Type == "child") == null && ChildGroup != null)
            value.Add(ChildGroup);
        this.groupsField = value;
    }
}

必须这样做以防止在类似于以下对象创建中覆盖值:

WikiMeta o = new WikiMeta()
{
    PeerGroup = new WikiGroup() { Name = "Test Peer" },
    ChildGroup = new WikiGroup() { Name = "Test Child" },
    Groups = new List<WikiGroup>()
};
于 2013-10-24T13:27:12.140 回答