获取由自定义属性过滤的PropertyDescriptorCollection

时间:2017-08-01 15:26:39

标签: c# custom-attributes typedescriptor propertydescriptor

我需要获得一个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();
}

到目前为止,我使它成功的唯一方法是第三次尝试,我想知道是否有更直观和更优雅的方式。

输出如下:

enter image description here

正如您所看到的,我只能设法在最后一次尝试时获得这两个属性。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题...你想要所有具有特定属性的属性而不管这个属性值是什么?

class type required but T found