2010-01-07 4 views

Antwort

21

Attribute sind Metadaten. In der Regel möchten Sie ein Element dekorieren oder mit einem Attribut versehen, um einige Informationen darüber zu finden.

Zum Beispiel wird die Description von Property verwendet, um eine Beschreibung einer Eigenschaft zu beschriften:

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

Die meiste Zeit, würde mehr als eine Beschreibung, die keinen Sinn machen.

Es ist jedoch möglich, dass ein bestimmtes Attribut sinnvoll ist, wenn es mehrmals verwendet wird. In diesem Fall sollten Sie das Attribut so einstellen, dass mehrere Instanzen von sich mit demselben Attribut versehen sind.

(Nicht, dass ich das tun würde, aber ...) Angenommen, Sie haben ein benutzerdefiniertes Attribut erstellt, um wichtige Änderungen an einer Klasse zu verfolgen. Sie können dies für jede größere Änderung auflisten:

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

Um auf Ihrem Beschreibungsbeispiel aufzubauen und das Beispiel "Ich würde dies nicht tun" zu vermeiden, betrachten Sie ein LocalisedDescriptionAttribute, das sowohl eine Ländereinstellung als auch eine Beschreibung enthält. Dies könnte für verschiedene Locales mehrfach angewendet werden: '[LocalisedDescription (" en-NZ "," sweet as ")] [LocalisedDescription (" en-GB "," jolly gut ")]'. – itowlson

+1

Viel besser formuliert als meine Antwort :) –

+0

@itowlson: Ja, obwohl ich wahrscheinlich wieder die Standardlokalisierungsoptionen verwenden würde ... Das wäre aber ein anderes gutes Beispiel. –

5

Dieses Beispiel könnte ein wenig erfunden sein, aber hoffentlich bekommt es den Punkt herüber.

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

} 
2

Dies hängt davon ab, was die Attribute sind.

Zum Beispiel könnten Sie ein Attribut erstellen, das eine Klasse als abhängig von etwas markiert, und Sie könnten mehrere Abhängigkeiten zulassen.

Für ein konkretes Beispiel, siehe SuppressMessage, die eine Codeanalyse Warnung unterdrückt. Ein Mitglied kann mehrere Warnungen haben, die Sie möglicherweise unterdrücken möchten. Ein anderes Beispiel ist WebResource; Eine Assembly kann mehrere Ressourcen enthalten.

1

Kein künstliches Beispiel hier, ich habe es in realen Produktionscode verwendet. Ich habe einen Code geschrieben, um eine Datei zu parsen, die Datenpaare wie (code = value) enthält. Ich legte ein benutzerdefiniertes Attribut auf eine Funktion, um anzuzeigen, dass es für einen bestimmten Code aufgerufen werden sollte.

Dieses bestimmte Format ist ein etwas altes und domänenspezifisch mit Hunderten von verschiedenen Codes. Mein Ziel war es, ein Framework zu schreiben, das das Schreiben von Dateiprozessoren erleichtert, die nur die benötigten Codes extrahieren und den Rest ignorieren können. Wenn Sie das gleiche Attribut mehrmals zulassen, können Sie die Absicht des Codes leicht ausdrücken, indem Sie einfach Attribute für die Funktion (en) deklarieren, die jeden Code verarbeiten.

0

Real World Anwendung Attribut AllowMultiple = true Nützlichkeit

[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() 

Ich blätterte AllowMultiple = true heute früher für das ManagesType Attribut zu erlauben, mehr als einmal verwendet werden. Wir haben mehrere hundert Custom Collection-Klassen.Die meisten dieser benutzerdefinierten Sammlungen verfügen über eine Ansicht, die von CustomView erbt, die für die Erstellung einer Benutzeroberflächenansicht für einen bestimmten Typ benutzerdefinierter Sammlung entwickelt wurde und diese dem Benutzer präsentiert. Das ManagesType-Attribut wird über Reflektion verwendet, um ein Wörterbuch der JEDEN Ansicht in unserer App zu erstellen, das von CustomView erbt, um zu "registrieren", für welchen Objekttyp es entworfen wurde. Die LibSpecSelectionView "brach dieses Muster", indem zwei verschiedene Sammlungen gleichzeitig angezeigt wurden (erstellt zwei Registerkarten und zeigt eine benutzerdefinierte Sammlung auf einer Registerkarte und die andere auf der zweiten Registerkarte). So kann dieselbe Ansicht zwei verschiedene benutzerdefinierte Sammlungen verarbeiten. Das Wörterbuch, dessen Ansichten in der Lage sind, welche Sammlungstypen zu verarbeiten, wird dann durch eine Erweiterungsmethode genutzt, um es allen benutzerdefinierten Sammlungen zu ermöglichen, die registrierte Ansicht (oder eine Standardansicht, wenn keine "registrierte" Ansicht vorliegt) durch eine zu starten Zeilenaufruf an den View-Manager.

Verwandte Themen