2008-10-16 8 views
14

Ich habe den folgenden Code gesehen:C# Eigenschaft Attribute

[DefaultValue(100)] 
[Description("Some descriptive field here")] 
public int MyProperty{...} 

Die Funktionalität aus der obigen snippit scheint klar genug, ich habe keine Ahnung, wie ich es sinnvoll, Dinge zu tun, verwenden kann. Ich bin mir nicht einmal sicher, welchen Namen ich geben soll!

Weiß jemand, wo ich weitere Informationen/ein Tutorial zu diesen Eigenschaftenattributen finden kann? Ich würde mich auch für alle Roman/nützliche Aufgaben interessieren, die diese Eigenschaft tun kann.

Antwort

13

Die Benutzer haben bereits den UI-Aspekt behandelt - Attribute haben jedoch andere Verwendungszwecke ... zum Beispiel werden sie in den meisten Serialisierungs-Frameworks häufig verwendet. Einige Attribute angegeben werden spezielle Behandlung durch den Compiler - zum Beispiel, fügt [PrincipalPermission(...)] deklarative Sicherheit auf ein Verfahren, mit dem Sie (automatisch) überprüfen, ob der Benutzer geeignet Zugriff hat.

Um Ihre eigene spezielle Handhabung hinzuzufügen, können Sie PostSharp verwenden; Es gibt viele gute Beispiele für die Verwendung von PostSharp, um AOP-Dinge zu erledigen, wie zum Beispiel Logging - oder einfach Code-Vereinfachung, wie mit automatic INotifyPropertyChanged implementation.

6

Die, die in Ihrem Beispiel werden durch den visuellen Designer (das heißt MS Expression Blend und Visual Studio-Designer) zu geben Hinweise im Designer UI verwendet.

Beachten Sie, dass sie Metadaten sind und nicht die Eigenschaft Logik beeinflussen. Wenn Sie beispielsweise DefaultValue setzen, wird die Eigenschaft standardmäßig nicht auf diesen Wert gesetzt. Dies müssen Sie manuell tun. Wenn Sie aus irgendeinem Grund auf diese Attribute zugreifen möchten, müssten Sie .

Weitere Informationen zu Designerattributen finden Sie unter MSDN.

+0

Sie werden auch im Visual Studio Designer verwendet. –

+0

Und es ist wichtig zu beachten, dass es sich nur um Hinweise handelt: Sie müssen den Standardwert Ihrer MyProperty beispielsweise im Code auf 100 setzen, sonst werden Sie den Verbraucher Ihrer Unterkunft belügen. –

6

Sie werden Attribute genannt, es gibt eine Menge Informationen in msdn, z.B. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

Im Allgemeinen "tun" sie nichts selbst, sie werden von irgendeinem anderen Code benutzt, der Ihre Klasse benutzt. XmlSerialization ist ein gutes Beispiel: XmlSerializer (von Microsoft als Teil des Frameworks bereitgestellt) kann fast jede Klasse (es gibt eine Reihe von Anforderungen für die Klasse obwohl) - es verwendet Reflektion, um zu sehen, welche Daten in der Klasse enthalten sind. Sie können Attribute verwenden (die zusammen mit XmlSerializer definiert werden), um die Art und Weise zu ändern, in der XmlSerializer Ihre Klasse serialisiert (z. B. die Daten als Attribut anstelle von Element speichern).

27

Die Funktionalität aus dem obigen snippit scheint klar genug,

Vielleicht nicht, wie viele Leute denken, dass [Default()] Sätze der Wert der Immobilie. Eigentlich ist dies alles, um einem visuellen Designer (z. B. Visual Studio) mitzuteilen, wofür der Code den Standardwert festlegen soll. Auf diese Weise weiß es fett der Wert im Eigenschaftenfenster, wenn es auf etwas anderes festgelegt ist.

+0

Also, wenn ich MyProperty nicht explizit auf einen anderen Wert gesetzt hatte, würde der Formulardesigner (oder Equivalent) MyProperty hinter den Kulissen auf 100 setzen? –

+3

NEIN! Wenn Sie MyProperty nicht explizit auf einen Wert festlegen, wird standardmäßig 0 (unter der Annahme eines Sicherungsspeichers) verwendet. Der Formular-Designer zeigt den Wert als "0" an, aber fett formatiert, um zu implizieren, wurde von der Standardeinstellung manuell geändert. Betrifft nur das Aussehen des Werts im Formular-Designer. –

+0

Ahhh das macht Sinn. Vielen Dank! –

3

Wir definieren damit, welcher grafische Designer geladen werden soll, um eine Instanz eines bestimmten Typs zu konfigurieren.

Das heißt, wir haben eine Art Workflow-Designer, der alle möglichen Befehl Typen aus einer Assembly lädt. Diese Befehlstypen haben Eigenschaften, die konfiguriert werden müssen, , so dass jeder Befehlstyp einen anderen Designer benötigt (usercontrol).

Betrachten wir zum Beispiel den folgenden Befehl ein (ein Verbund in unserer Lösung genannt)

[CompositeMetaData("Delay","Sets the delay between commands",1)] 
[CompositeDesigner(typeof(DelayCompositeDesigner))] 
public class DelayComposite : CompositeBase 
{ 
     // code here 
} 

Dies wird Informationen an zwei Stellen verwendet wird

1) Wenn der Designer eine Liste von Befehlen erzeugt, Es verwendet das CompositeMetaData , um weitere Informationen zu dem Befehl anzuzeigen.

2) Wenn der Benutzer einen Befehl an den Designer fügt und der Designer schafft eine Instanz dieser Klasse, es an der CompositeDesigner Eigenschaft sieht schafft eine neue Instanz des angegebenen Typs (Usercontrol) und fügt sie zu der visuelle Designer.

Betrachten Sie den folgenden Code, wir verwenden, um die Befehle in unserer „Symbolleiste“ zu laden:

Wie Sie sehen können, für jede Art in der Montage von dem der Name mit den „Komposit“ endet, Wir erhalten die benutzerdefinierten Attribute und verwenden diese Informationen zum Auffüllen unserer ToolboxListItem-Instanz.

Wie für den Designer laden, wird das Attribut wie folgt retreived:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false) 
         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault(); 

Dies ist nur ein Beispiel dafür, wie Sie damit benutzerdefinierte Attribute verwendet, möglicherweise in der Lage

Ich hoffe, das gibt Ihnen ein Ort zum Starten.