拥有对象列表:
List<ConfigurationObjectBase> ObjectRegistry;
使用该属性装饰以下属性和上述某些对象:
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = true)]
public sealed class PropertyCanHaveReference : Attribute
{
public PropertyCanHaveReference(Type valueType)
{
this.ValueType = valueType;
}
public Type ValueType { get; set; }
}
现在,我想找到属性用该属性修饰的所有对象。
尝试下面的代码,似乎我做错了:
List<ConfigurationObjectBase> tmplist = ObjectRegistry.Where(o => (o.GetType().GetProperties().Where(p => p.GetCustomAttributes(typeof(PropertyCanHaveReference), true).Length > 0)));
感谢您的时间。
答案 0 :(得分:1)
您显示的代码行中似乎有一些语法错误。您可以将一些Where
/ Count
组合转换为Any()
。这对我有用:
List<ConfigurationObjectBase> tmplist =
ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p =>
p.GetCustomAttributes(typeof(PropertyCanHaveReference), true).Any())).ToList();
因此,您筛选所有具有任何属性的任何属性的对象。
您还可以使用通用GetCustomAttribute<T>()
方法:
List<ConfigurationObjectBase> tmplist =
ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p =>
p.GetCustomAttribute<PropertyCanHaveReference>(true) != null)).ToList();
请考虑根据约定PropertyCanHaveReferenceAttribute
命名您的属性类。
答案 1 :(得分:0)
以下是获取对象列表的代码,其中包含使用自定义属性修饰的属性:
List<ConfigurationObjectBase> tmplist = ObjectRegistry.Where(o =>
(o.GetType().GetProperties(System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).Where(
prop => Attribute.IsDefined(prop, typeof(PropertyCanHaveReference)))).Any()).ToList();
您的代码只会获得已装饰的公共属性。上面的代码将同时获得:公共和非公开。
答案 2 :(得分:0)
此System.Type扩展方法应该有效:
public static IEnumerable<PropertyInfo> GetPropertiesWithAttribute<TAttribute>(this Type type) where TAttribute : Attribute
{
var properties = type.GetProperties();
// Find all attributes of type TAttribute for all of the properties belonging to the type.
foreach (PropertyInfo property in properties)
{
var attributes = property.GetCustomAttributes(true).Where(a => a.GetType() == typeof(TAttribute)).ToList();
if (attributes != null && attributes.Any())
{
yield return property;
}
}
}