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



有对象列表:

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。

相关内容

  • 没有找到相关文章

最新更新