【问题标题】:Passing C# attributes to other attributes将 C# 属性传递给其他属性
【发布时间】:2015-12-27 17:21:05
【问题描述】:

是否可以将 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# xml serialization custom-attributes


    【解决方案1】:

    不创建常量,不,你不能这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2013-09-15
      相关资源
      最近更新 更多