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()
);
我正在尝试获取程序集中具有自定义属性的所有属性。 我是这样做的,但我是通过两个步骤进行相同的验证。
例如:
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()
);