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

本文关键字:属性 其他 | 更新日期: 2023-09-27 18:28:14

是否可以将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]属性时那样有效。当我有c++/java/objective c客户端时,当我使用不同的Xml序列化程序/反序列化程序时,这也可能会在以后带来问题。

对此有什么想法吗?

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

如果不创建常量,就无法做到这一点。

读取这些属性的代码可以更改为在另一个属性中使用一个属性,但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; }