2010-01-07 8 views

Répondre

21

Les attributs sont des méta-données. En règle générale, vous voulez décorer un membre ou taper un attribut afin de suivre certaines informations à ce sujet.

Par exemple, le DescriptionAttribute est utilisé par PropertyGrid pour étiqueter une description d'une propriété:

[Description("This is my property")] 
public int MyProperty { get; set; } 

La plupart du temps, ayant plus d'une seule description ne serait pas logique.

Cependant, il est possible qu'un attribut spécifique ait un sens à utiliser plusieurs fois. Dans ce cas, vous devez définir l'attribut pour autoriser plusieurs instances de lui-même associées au même attribut.

(Ce n'est pas ce que je ferais, mais ...) Dites que vous avez créé un attribut personnalisé pour suivre les modifications majeures apportées à une classe. Vous pouvez inscrire sur la liste pour chaque changement majeur:

[Changes(Version=1.1, Change="Added Foo Feature")] 
[Changes(Version=2.0, Change="Added Bar Feature")] 
public class MyClass 
{ 
    // ... 
+6

Pour construire sur votre exemple de description et éviter l'exemple "Je ne ferais pas cela" Modifications, considérons un LocalisedDescriptionAttribute, qui a à la fois une locale et une description. Cela pourrait être appliqué plusieurs fois pour des locales différentes: '[LocalisedDescription (" en-NZ "," sweet as ")] [LocalisedDescription (" en-GB "," jolly good ")]'. – itowlson

+1

Beaucoup mieux formulé que ma réponse :) –

+0

@itowlson: Oui, bien que, encore une fois, j'utiliserais probablement les options de localisation standard ... Ce serait un autre bon exemple, cependant. –

5

Cet exemple pourrait être un peu artificiel mais nous espérons qu'il obtient le point à travers.

[Convertable(typeof(Int32)), Convertable(typeof(Double))] 
public class Test 
{ 

} 
2

Cela dépend de ce que sont les attributs. Par exemple, vous pouvez créer un attribut qui marque une classe en fonction de quelque chose, et vous pouvez autoriser plusieurs dépendances.

Pour un exemple concret, regardez SuppressMessage, qui supprime un avertissement d'analyse de code. Un membre peut avoir plusieurs avertissements que vous pourriez vouloir supprimer. Un autre exemple est le WebResource; un assembly peut contenir plusieurs ressources.

1

Aucun exemple ici artificiel, je l'ai utilisé dans le code de production réel. J'ai écrit du code pour analyser un fichier contenant des paires de données comme (code = valeur). J'ai mis un attribut personnalisé sur une fonction pour indiquer qu'il devrait être appelé pour un code donné.

[CanParseCode("G1")] 
[CanParseCode("G2")] 
private void ParseGXCodes(string code, string value) 
{ 
    ... 
} 

Ce format particulier est un peu vieux et domaine spécifique avec des centaines de codes différents. Mon but était d'écrire un cadre pour rendre plus facile l'écriture de processeurs de fichiers qui pourraient extraire seulement les codes dont il a besoin et ignorer le reste. Permettre plusieurs fois le même attribut rendait facile l'expression de l'intention du code en déclarant simplement les attributs sur les fonctions qui traitent chaque code.

0

Real World Application des attributs AllowMultiple = true utilité

[ManagesType(typeof(SPEC_SEC_OC), true)] 
[ManagesType(typeof(SPEC_SEC_04_OC), true)] 
public class LibSpecSelectionView : CustomView 
{ 
    public LibSpecSelectionView(SPEC_SEC_OC) 
    {} 
    public LibSpecSelectionView(SPEC_SEC_O4_OC) 
    {} 
    .... 
} 

public static class ViewManager 
{ 
    ... static Dictionary of views built via reflection 
    public void LaunchView(this CollectionBaseClass cbc) 
    { 
     ... Find class registered to handle cbc type in dictionary and call ctor 
    } 
} 

SPEC_SEC_OC myOC = DataClient.Instance.GetSPEC_SEC_OC(); 
myOC.LaunchView() 

Je AllowMultiple = true retourné plus tôt aujourd'hui pour permettre l'attribut ManagesType à utiliser plus d'une fois. Nous avons plusieurs centaines de classes de collection personnalisées.La plupart de ces collections personnalisées ont une vue qui hérite de CustomView conçu pour gérer la création d'une vue d'interface utilisateur pour un type spécifique de collection personnalisée et la présenter à l'utilisateur. L'attribut ManagesType est utilisé via la réflexion pour créer un dictionnaire de EVERY View dans notre application qui hérite de CustomView pour "enregistrer" le type d'objet pour lequel il a été conçu. Le LibSpecSelectionView "cassé ce modèle" en affichant deux collections différentes en même temps (crée deux onglets et montre une collection personnalisée dans un onglet et l'autre dans le deuxième onglet) Ainsi, la même vue est capable de gérer deux collections personnalisées différentes. Le dictionnaire dont les vues peuvent gérer les types de collections est ensuite exploité via une méthode d'extension pour permettre à l'une de nos collections personnalisées de lancer la vue enregistrée (ou une vue par défaut s'il n'y a pas de vue "enregistrée"). appel de ligne au gestionnaire de vue.