Reflection + Linq 获取 Assembly 中所有具有 Attribute 的属性

Reflection + Linq to get all properties that has Attribute in Assembly

我正在尝试获取程序集中具有自定义属性的所有属性。 我是这样做的,但我是通过两个步骤进行相同的验证。

例如:

abstract class XX

class Y1 : XX {
   [MyCustomAttribute(Value = "val A")]
   public int Something {get; set;}

}

class Y2 : XX {
   [MyCustomAttribute(Value = "val A")]
   public int Another {get; set;}

}

class Y3 : XX {
   [MyCustomAttribute(Value = "val B")]
   public int A1 {get; set;}

   [MyCustomAttribute(Value = "val C")]
   public int A2 {get; set;}

}

因此包含所有 属性 的列表包含它

Something
Another
A1
A2

我正在使用这个 linq

string attrFilter = "SomeValue";

var ts = this.GetType().Assembly.GetTypes().ToList().FindAll(c => typeof(XX).IsAssignableFrom(c) && !c.IsAbstract && !c.IsInterface);

var classes = from classe in ts
              where classe.GetProperties().ToList().FindAll(
                      property => property.GetCustomAttributes(typeof(MyCustomAttribute), false).ToList().FindAll(
                          att => typeof(MyCustomAttribute).IsAssignableFrom(att.GetType()) && (att as MyCustomAttribute).Value == attrFilter
                      ).Count > 0
                    ).Count > 0
              select classe;

这只会给我 classes。所以我需要从每个 class

中提取属性
List<PropertyInfo> properties = new List<PropertyInfo>();
Parallel.ForEach(classes, classe => {
    var props = classe.GetProperties().ToList();
    var fks = from property in props
              where property.GetCustomAttributes(typeof(MyCustomAttribute), false).ToList().FindAll(
                          att => typeof(MyCustomAttribute).IsAssignableFrom(att.GetType()) && (att as MyCustomAttribute).Value == attrFilter
                      ).Count > 0
              select property;

    fks.ToList().ForEach(p => properties.Add(p));
});

如您所见,WHERE 属性 linq 的条件与没有 [= 的 class 查询相同40=]列表.

我想知道是否可以从第一个 linq 查询

中提取 属性

让我们分解一下。

获取所有类型:

var types = System.AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany
    ( 
        a => a.GetTypes() 
    );

对于所有类型,获取所有属性:

var properties = types.SelectMany
( 
    t => t.GetProperties() 
);

对于所有属性,获取具有所需属性的属性:

var list = properties.Where
( 
    p => p.GetCustomAttributes(typeof(Attribute), true).Any() 
);

总计:

var list= System.AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany( a => a.GetTypes() )
    .SelectMany( t => t.GetProperties() )
    .Where
    ( 
        p => p.GetCustomAttributes(typeof(Attribute), true).Any() 
    );