Ruft alle Eigenschaften ab, die ein bestimmtes Attribut markiert haben

80

Ich habe Klasse und Eigenschaften dort. Einige Eigenschaften können als Attribut markiert werden (es ist mein LocalizedDisplayNameErbe von DisplayNameAttribute). Dies ist eine Methode zum Abrufen aller Eigenschaften der Klasse:

private void FillAttribute()
{
    Type type = typeof (NormDoc);
    PropertyInfo[] propertyInfos = type.GetProperties();
    foreach (var propertyInfo in propertyInfos)
    {
        ...
    }
}

Ich möchte der Listbox Eigenschaften der Klasse hinzufügen, die den LocalizedDisplayNameWert des Attributs in der Listbox markieren und anzeigen. Wie kann ich das machen?

BEARBEITEN
Dies ist LocalizedDisplayNameAttribute:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
    {
        public LocalizedDisplayNameAttribute(string resourceId)
            : base(GetMessageFromResource(resourceId))
        { }

        private static string GetMessageFromResource(string resourceId)
        {
            var test =Thread.CurrentThread.CurrentCulture;
            ResourceManager manager = new ResourceManager("EArchive.Data.Resources.DataResource", Assembly.GetExecutingAssembly());
            return manager.GetString(resourceId);
        }
    }  

Ich möchte einen String aus der Ressourcendatei erhalten. Vielen Dank.

user348173
quelle
Was ist "Wert des Attributs"? Attribute sind Klassen und können viele "Werte" (Eigenschaften / Felder) haben. Vielleicht sprechen Sie über das Ergebnis von ToString()? Können Sie Ihre Frage bearbeiten, um Code für die benutzerdefinierten Attribute hinzuzufügen, die Sie anwenden, und angeben, welche Daten Sie daraus entfernen möchten?
Merlyn Morgan-Graham

Antworten:

132

Es ist wahrscheinlich am einfachsten zu bedienen IsDefined:

var properties = type.GetProperties()
    .Where(prop => prop.IsDefined(typeof(LocalizedDisplayNameAttribute), false));

Um die Werte selbst zu erhalten, verwenden Sie:

var attributes = (LocalizedDisplayNameAttribute[]) 
      prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false);
Jon Skeet
quelle
7
+1; Nit-pick: Ich würde IEnumerable<PropertyInfo>hier angeben :) Hilfreich, wenn die Person, die diese Antwort sieht, nicht mit Linq oder Reflections vertraut ist.
Merlyn Morgan-Graham