如何在不同类的属性之间共享属性

时间:2012-06-29 13:32:51

标签: c# attributes xml-serialization

采用以下示例代码:

public abstract class ElementBase 
{
}

public class ElementOne : ElementBase
{
}

public class ElementTwo : ElementBase
{
    [XmlElement("element-one", typeof(ElementOne))]
    [XmlElement("element-two", typeof(ElementTwo))]
    public ElementBase[] SubElements { get; set; }
}

[XmlRoot("root-element")]
public class RootElement 
{
    [XmlElement("element-one", typeof(ElementOne))]
    [XmlElement("element-two", typeof(ElementTwo))]
    public ElementBase[] SubElements { get; set;}
}

ElementOne.SubElementsElementTwo.SubElements上的属性需要保持同步(即,添加到一个的属性需要添加到另一个,并且参数需要保持不变),原因是这就是在xml中,<element-one>和元素都可以显示为<root-element><element-two>的子元素。元素可以是任何顺序,顺序很重要。此外,将来可能会有更多的子元素。它当前编码的方式会使维护繁琐且容易出错,因为需要为属性维护两个单独的位置。

有没有办法让这些属性&#34;共享&#34;两个属性之间,这样一个编辑会影响他们两个?我尝试了以下方法:

public class CommomAttribute : Attribute
{
    public XmlElementAttribute f = new XmlElementAttribute("element-one", typeof(ElementOne));
    public XmlElementAttribute l = new XmlElementAttribute("element-two", typeof(ElementTwo));
}

然后我替换了上述类中的冗余属性&#39;具有单个[Command]的属性。这没用。

另一个问题:是否有更优雅的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您不介意深入一级以获取子元素项,您可以试试这个:

public abstract class ElementBase
{
}

public class ElementOne : ElementBase
{
}

public class ElementTwo : ElementBase
{
    public SubElementList SubElements { get; set; }
}

public class SubElementList
{
    [XmlElement("element-one", typeof(ElementOne))]
    [XmlElement("element-two", typeof(ElementTwo))]
    public ElementBase[] Items { get; set; }
}

[XmlRoot("root-element")]
public class RootElement
{
    public SubElementList SubElements { get; set; }
}

答案 1 :(得分:0)

离开我的头顶,我会做以下事情:

  1. 在每个类(一个和两个)的ctor上,要求和ElementBase的实例并将其保存为私有属性(比方说,“SyncingElement”)
  2. 修改子元素的setter,以与“SyncingElement”实例同步
  3. 这样,两个对象上的SubElements将具有相同的内存地址(相同的实例)。因此,如果有人从One获取SubElements的实例,则修改index [2]处的对象(例如),它也会影响SubElements at Two。