c#从列表对象获取具有特定属性的属性

时间:2016-08-29 14:59:50

标签: c# linq list reflection attributes

拥有对象列表:

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)));

感谢您的时间。

3 个答案:

答案 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;
        }
    }
}