我需要获得一个PropertyDescriptorCollection
,其中包含使用自定义属性修饰的所有属性。问题是TypeDescriptor.GetProperties
只能通过所有属性属性的精确匹配进行过滤,因此如果我想获取所有属性,无论属性的属性如何设置,我都必须覆盖过滤器数组中的所有可能性。
以下是我的attribue的代码:
[AttributeUsage(AttributeTargets.Property)]
class FirstAttribute : Attribute
{
public bool SomeFlag { get; set; }
}
带有装饰属性的类:
class Foo
{
[First]
public string SomeString { get; set; }
[First(SomeFlag = true)]
public int SomeInt { get; set; }
}
主要:
static void Main(string[] args)
{
var firstPropCollection = TypeDescriptor.GetProperties(typeof(Foo), new Attribute[] {new FirstAttribute()});
Console.WriteLine("First attempt: Filtering by passing an array with a new FirstAttribute");
foreach (PropertyDescriptor propertyDescriptor in firstPropCollection)
{
Console.WriteLine(propertyDescriptor.Name);
}
Console.WriteLine();
Console.WriteLine("Second attempt: Filtering by passing an an array with a new FirstAttribute with object initialization");
var secondPropCollection = TypeDescriptor.GetProperties(typeof(Foo), new Attribute[] { new FirstAttribute {SomeFlag = true} });
foreach (PropertyDescriptor propertyDescriptor in secondPropCollection)
{
Console.WriteLine(propertyDescriptor.Name);
}
Console.WriteLine();
Console.WriteLine("Third attempt: I am quite ugly =( ... but I work!");
var thirdCollection = TypeDescriptor.GetProperties(typeof(Foo)).Cast<PropertyDescriptor>()
.Where(p => p.Attributes.Cast<Attribute>().Any(a => a.GetType() == typeof(FirstAttribute)));
foreach (PropertyDescriptor propertyDescriptor in thirdCollection)
{
Console.WriteLine(propertyDescriptor.Name);
}
Console.ReadLine();
}
到目前为止,我使它成功的唯一方法是第三次尝试,我想知道是否有更直观和更优雅的方式。
输出如下:
正如您所看到的,我只能设法在最后一次尝试时获得这两个属性。
答案 0 :(得分:1)
我不确定我是否理解这个问题...你想要所有具有特定属性的属性而不管这个属性值是什么?
class type required but T found