2010-04-23 7 views
2

J'ai une propriété dans une classe de base étiqueté avec des attributs, et je voudrais changer certains attributs dans chacune de mes classes dérivées. Quelle est la meilleure façon de procéder? D'après ce que je peux dire, je dois définir la propriété comme abstraite dans ma classe de base et remplacer la propriété dans chacune de mes classes de base, et redéfinir tous les attributs. Cela semble vraiment redondant, et je ne suis pas folle parce que je devrais répéter les attributs communs dans chaque classe dérivée.Modifier la valeur d'un attribut dans une classe dérivée?

Ceci est un exemple simplifié de ce que j'essaie de faire. Je souhaite modifier MyAttribute dans les classes dérivées mais conserver tous les autres attributs de la propriété identiques et définis en un seul endroit (c'est-à-dire que je ne souhaite pas devoir redéfinir XmlElement plusieurs fois). Est-ce seulement possible? Ou y a-t-il une meilleure façon de faire cela? Ou suis-je complètement abuser des attributs ici?

using System; 
using System.Xml; 
using System.Xml.Serialization; 

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class MyAttribute : System.Attribute 
{ 
    public MyAttribute() {} 

    public string A { get; set; } 

    public string B { get; set; } 
} 

public abstract class BaseClass 
{ 
    public BaseClass() {} 

    [XmlElement("some_property")] 
    [MyAttribute(A = "Value1", B = "Value2")] 
    public string SomeProperty { get; set; } 
} 

public class FirstDerivedClass : BaseClass 
{ 
    //I want to change value B to something else 
    //in the MyAttribute attribute on property SomeProperty 
} 

public class SecondDerivedClass : BaseClass 
{ 
    //I want to change value B to yet another value 
    //in the MyAttribute attribute on property SomeProperty 
} 
+0

"Ou est-ce que j'utilise complètement les attributs ici?" - c'est juste ce que l'on ressent. Pour quel genre de choses utilisez-vous vos attributs réels? – AakashM

+0

Sur un petit projet j'ai expérimenté avec la réflexion et j'utilise les attributs pour générer des formulaires html avec des messages d'erreur et des trucs comme ça. Encore une fois, ce n'est probablement pas la meilleure utilisation des attributs mais bon j'ai appris quelque chose de nouveau. – wsanville

Répondre

0

Vous pouvez utiliser la méthode GetCustomAttributes pour revenir soit tous les attributs à tous les niveaux d'héritage, ou tout simplement la classe mis en œuvre. Malheureusement, cela ne vous permet pas de remplacer un attribut 'AllowMultiple = false'. Vous pouvez probablement créer une méthode qui appelle GetCustomAttribute deux fois, une fois avec des valeurs héritées et une fois sans. Vous pouvez ensuite donner la préférence des valeurs non héritées sur les valeurs héritées. Je peux poster un échantillon plus tard si nécessaire.

Questions connexes