Динамически добавлять элементы в ListBox через атрибуты - PullRequest
1 голос
/ 22 декабря 2011

У меня есть 3 класса (все они происходят из одного базового класса), и мне нужно динамически заполнить ListBox с помощью Property-Names.

Я пробовал вот так

class Test : TestBase {
    [NameAttribute("Name of the Person")]
    public string PersonName { get; set; }

    private DateTime Birthday { get; set; }
    [NameAttribute("Birthday of the Person")]
    public string PersonBDay {
        get {
            return this.bDay.ToShortDateString();
        }
    }
}

...
[AttributeUsage(AttributeTargets.Property)]
public class NameAttribute : Attribute {
    public string Name { get; private set; }

    public NameAttribute(string name) {
        this.Name = name;
    }
}

Есть ли возможность посмотреть в моем объекте все свойства, которые имеют атрибут NameAttribute и получить строку из свойства Name NameAttribute?

1 Ответ

2 голосов
/ 22 декабря 2011

Вы можете проверить каждое свойство из Type.GetProperties, а затем отфильтровать те, которые имеют требуемый атрибут, с помощью метода MemberInfo.GetCustomAttributes.

С небольшимнемного LINQ, это будет выглядеть так:

var propNameTuples = from property in typeof(Test).GetProperties()
                     let nameAttribute = (NameAttribute)property.GetCustomAttributes
                                (typeof(NameAttribute), false).SingleOrDefault()
                     where nameAttribute != null
                     select new { Property = property, nameAttribute.Name };

foreach (var propNameTuple in propNameTuples)
{
    Console.WriteLine("Property: {0} Name: {1}",
                      propNameTuple.Property.Name, propNameTuple.Name);
}

Кстати, я также рекомендую объявлять атрибут одноразовым только с AllowMultiple = false в оформлении AttributeUsage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...