有对象列表:
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)));
感谢您的宝贵时间。
您显示的代码行中似乎有一些语法错误。你可以把一些Where
/Count
组合转换成Any()
。
List<ConfigurationObjectBase> tmplist =
ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p =>
p.GetCustomAttributes(typeof(PropertyCanHaveReference), true).Any())).ToList();
所以你过滤了所有具有any属性的对象,这些对象具有你的类型的any属性。
您也可以使用通用的GetCustomAttribute<T>()
方法:
List<ConfigurationObjectBase> tmplist =
ObjectRegistry.Where(o => o.GetType().GetProperties().Any(p =>
p.GetCustomAttribute<PropertyCanHaveReference>(true) != null)).ToList();
请考虑将您的属性类命名为PropertyCanHaveReferenceAttribute
这个系统。类型扩展方法应该工作:
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;
}
}
}
下面是获取对象列表的代码,该列表的属性使用自定义属性进行装饰:
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();
你的代码将只获得公共属性,这些属性已经被装饰过了。上面的代码将得到:public和non-public。