将C#属性传递给其他属性

时间:2015-12-27 17:21:05

标签: c# xml serialization custom-attributes

是否可以将C#属性(注释?)从一个声明传递到另一个声明?我想让以下工作:

请遵守以下假设代码:

[Serializable]
public class Something
{
  [XmlArray(ElementName = "Array")]
  [XmlArrayItem(ElementName = "Item")]
  public List<UnpleasantlyNamedItem> Items { get; private set; }
}

现在,这将像魅力一样序列化和反序列化。它运作得非常好。但是对于我们的项目,我需要这样的东西。

[Serializable]
public class EvolvableList<T> where T : GameObject
{
  [XmlArray(ElementName = "Add")]
  [XmlArrayItem(ElementName = I want my "AddItemName" attribute here)]
  public List<T> Add { get; private set; }

  [XmlArray(ElementName = "Edit")]
  [XmlArrayItem(ElementName = I want my "EditItemName" attribute here)]
  public List<ObjectTransformation<T>> Edit { get; private set; }

  [XmlArray(ElementName = "Remove")]
  [XmlArrayItem(ElementName = I want my "RemoveItemName" attribute here)]
  public List<ObjectReference<T>> Remove { get; private set; }
}

[Serializable]
public class UpgradeLevel
{
  [XmlAttribute(AttributeName = "Level")
  public int Level { get; set; }

  [XmlElement(ElementName = "Models")]
  [ExtXmlEvolvableList(AddItemName = "Model", EditItemName = "Model", RemoveItemName = "Model")]
  public EvolvableList<Model> Models { get; private set; }

  [XmlElement(ElementName = "Sprites")]
  [ExtXmlEvolvableList(AddItemName = "Sprite", EditItemName = "Sprite", RemoveItemName = "Sprite")]
  public EvolvableList<Sprite> Sprites { get; private set; }
}

这可能吗?我试过谷歌搜索它,但我不知道如何说出查询肯定说。我是注释概念的新手,因为我主要用C / C ++编写软件。

我已经尝试过让序列化程序通过省略[XmlArrayItem]属性来决定名称本身。这给了我一个相当笨拙的“ReferenceOfModel”元素名称。这本身并不是一个大问题。然而,在反序列化时它会成为一个问题。这似乎与我使用[XmlArrayItem]属性时的效果不一样。当我使用不同的Xml序列化器/反序列化器时,如果我有c ++ / java / objective c客户端,它也可能在以后出现问题。

对此有何想法?

1 个答案:

答案 0 :(得分:0)

不创造常数,不,你不能这样做。

读取这些属性的代码可以更改为在另一个内部使用,但C#或.NET中没有任何内置允许这样做。

持续:

private const string AddItemName = "Add";
[XmlArray(ElementName = AddItemName)]
[XmlArrayItem(ElementName = "I want my " + AddItemName + " attribute here")]
public List<T> Add { get; private set; }