通过Attributes动态地将项添加到ListBox

时间:2011-12-22 08:41:34

标签: c# .net reflection

我有3个类(都来自相同的基类),我必须使用Property-Names动态填充ListBox。

我试过这样的

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的{​​{1}}属性中获取字符串?

1 个答案:

答案 0 :(得分:2)

您可以检查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一次使用。