Während der Code zum Erstellen eines benutzerdefinierten Attributs ziemlich einfach ist, ist es sehr wichtig, dass Sie verstehen, was Attribute sind:
Attribute sind Metadaten, die in Ihrem Programm kompiliert wurden. Attribute selbst fügen einer Klasse, Eigenschaft oder einem Modul keine Funktionalität hinzu - nur Daten. Mithilfe der Reflexion können diese Attribute jedoch genutzt werden, um Funktionen zu erstellen.
Schauen wir uns zum Beispiel den Validierungsanwendungsblock aus der Microsoft Enterprise Library an . Wenn Sie sich ein Codebeispiel ansehen, sehen Sie:
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
Aus dem obigen Snippet könnte man schließen, dass der Code immer validiert wird, wenn er gemäß den Regeln des Validators geändert wird (im Beispiel mindestens 8 Zeichen und höchstens 8 Zeichen). Aber die Wahrheit ist, dass das Attribut nichts tut; Wie bereits erwähnt, werden der Eigenschaft nur Metadaten hinzugefügt.
Die Unternehmensbibliothek verfügt jedoch über eine Validation.Validate
Methode, die Ihr Objekt untersucht und für jede Eigenschaft prüft, ob der Inhalt gegen die durch das Attribut angegebene Regel verstößt.
So sollten Sie also über Attribute nachdenken - eine Möglichkeit, Ihrem Code Daten hinzuzufügen, die später möglicherweise von anderen Methoden / Klassen / etc. Verwendet werden.
Sie beginnen mit dem Schreiben einer Klasse, die von Attribute abgeleitet ist :
Dann können Sie alles (Klasse, Methode, Eigenschaft, ...) mit diesem Attribut dekorieren:
und schließlich würden Sie Reflexion verwenden, um es zu holen:
Sie können die Zieltypen, auf die dieses benutzerdefinierte Attribut angewendet werden kann, mithilfe des Attributs AttributeUsage einschränken :
Wichtige Informationen zu Attributen:
quelle
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
Verwenden Sie die großartige Antwort von Darin Dimitrov , um auf ein benutzerdefiniertes Attribut für eine Eigenschaft und nicht für eine Klasse zuzugreifen:
Das dekorierte Eigentum [der Klasse
Foo
]:Abrufen:
Sie können dies in eine Schleife werfen und mithilfe der Reflektion auf dieses benutzerdefinierte Attribut für jede Eigenschaft der Klasse zugreifen
Foo
:Vielen Dank an dich, Darin !!
quelle
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Ich möchte nur allem1()