Ich habe eine Klasse, nennen wir sie Buch mit einer Eigenschaft namens Name. Mit dieser Eigenschaft ist ein Attribut verknüpft.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
In meiner Hauptmethode verwende ich Reflektion und möchte das Schlüsselwertpaar jedes Attributs für jede Eigenschaft erhalten. In diesem Beispiel würde ich erwarten, dass "Autor" als Attributname und "Autorenname" als Attributwert angezeigt werden.
Frage: Wie erhalte ich mithilfe von Reflection den Attributnamen und den Wert für meine Eigenschaften?
c#
reflection
propertyinfo
Developerdoug
quelle
quelle
Antworten:
Verwenden Sie
typeof(Book).GetProperties()
diese Option , um ein Array vonPropertyInfo
Instanzen abzurufen. Verwenden Sie dannGetCustomAttributes()
jeweils,PropertyInfo
um festzustellen, ob einer von ihnen denAuthor
Attributtyp hat. In diesem Fall können Sie den Namen der Eigenschaft aus den Eigenschaftsinformationen und die Attributwerte aus dem Attribut abrufen.Etwas in dieser Richtung, um einen Typ nach Eigenschaften zu durchsuchen, die einen bestimmten Attributtyp haben, und um Daten in einem Wörterbuch zurückzugeben (beachten Sie, dass dies durch Übergeben von Typen an die Routine dynamischer gestaltet werden kann):
quelle
Verwenden Sie Folgendes, um alle Attribute einer Eigenschaft in einem Wörterbuch abzurufen:
Denken Sie daran, von
false
zu zu wechseln ,true
wenn Sie auch geerbte Attribute einschließen möchten.quelle
Wenn Sie nur einen bestimmten Attributwert möchten, können Sie zum Beispiel Anzeigeattribut den folgenden Code verwenden:
quelle
Ich habe ähnliche Probleme gelöst, indem ich einen Generic Extension Property Attribute Helper geschrieben habe:
Verwendung:
quelle
Fields
?Sie können verwenden
GetCustomAttributesData()
undGetCustomAttributes()
:quelle
Wenn Sie "für Attribute, die einen Parameter annehmen, die Attributnamen und den Parameterwert auflisten" meinen, ist dies in .NET 4.5 über die
CustomAttributeData
API einfacher :quelle
quelle
Während die oben am häufigsten bewerteten Antworten definitiv funktionieren, würde ich in einigen Fällen einen etwas anderen Ansatz vorschlagen.
Wenn Ihre Klasse mehrere Eigenschaften mit immer demselben Attribut hat und Sie diese Attribute in ein Wörterbuch sortieren möchten, gehen Sie wie folgt vor:
Dies verwendet weiterhin Cast, stellt jedoch sicher, dass der Cast immer funktioniert, da Sie nur die benutzerdefinierten Attribute vom Typ "AuthorName" erhalten. Wenn Sie mehrere Attribute über den Antworten hätten, würde eine Besetzungsausnahme auftreten.
quelle
Verwendung:
oder:
quelle
Hier sind einige statische Methoden, mit denen Sie die MaxLength oder ein anderes Attribut abrufen können.
Mit der statischen Methode ...
Oder verwenden Sie die optionale Erweiterungsmethode für eine Instanz ...
Oder verwenden Sie die vollständige statische Methode für ein anderes Attribut (z. B. StringLength) ...
Inspiriert von der Antwort des Mikael Engver.
quelle
Nekromantie.
Für diejenigen, die noch .NET 2.0 warten müssen oder die es ohne LINQ tun möchten:
Anwendungsbeispiel:
oder einfach
quelle
In diesem Beispiel habe ich DisplayName anstelle von Author verwendet, da ein Feld mit dem Namen 'DisplayName' mit einem Wert angezeigt werden soll.
quelle
Um ein Attribut von enum zu erhalten, verwende ich:
// Verwenden
quelle
Ich suche nur nach dem richtigen Ort, um diesen Code einzufügen.
Angenommen, Sie haben die folgende Eigenschaft:
Und Sie möchten den ShortName-Wert erhalten. Du kannst tun:
Oder um es allgemein zu machen:
quelle