2015-12-27 5 views
0

Est-il possible de transmettre des attributs C# (annotations?) D'une déclaration à une autre? Je suis en train de faire ce qui suit au travail:Passage d'attributs C# à d'autres attributs

Observer le code hypothétique suivant:

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

maintenant, cela sérialisation et la désérialisation comme un charme. Cela fonctionne merveilleusement bien. Cependant, pour notre projet, j'ai besoin de quelque chose comme ça.

[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; } 
} 

Est-ce possible? J'ai essayé de googler, mais je ne suis pas sûr de savoir comment formuler la requête pour dire à coup sûr. Je suis nouveau au concept d'annotations, puisque j'écris principalement des logiciels en C/C++.

J'ai déjà essayé de laisser le sérialiseur décider du nom lui-même en désactivant l'attribut [XmlArrayItem]. Cela me donne un nom d'élément "ReferenceOfModel" plutôt maladroit. Ce n'est pas en soi un gros problème. Cependant, cela devient un problème lors de la désérialisation. Cela ne semble tout simplement pas fonctionner aussi bien que lorsque j'utilise l'attribut [XmlArrayItem]. Il peut également poser un problème plus tard lorsque j'utilise des sérialiseurs/désérialiseurs Xml différents lorsque j'ai des clients C++/java/objective c.

Des commentaires à ce sujet?

Répondre

0

Sans créer de constante, non, vous ne pouvez pas faire cela.

Le code qui lit ces attributs pourrait être modifié pour utiliser l'un dans l'autre mais il n'y a rien de construit en C# ou .NET qui le permette.

Avec constante:

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