我有3个类(都从相同的基类派生),我必须动态地填充一个列表框与属性名称。
我已经试过了
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
的所有属性并从NameAttribute
的Name
属性中获得字符串?
您可以检查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);
}
顺便说一下,我还建议将该属性声明为仅在AttributeUsage
装饰中使用AllowMultiple = false
。