按属性的属性值对PropertyInfos列表进行排序

时间:2015-11-04 16:01:46

标签: c# linq properties attributes

我有一个Dto类型的对象:

public class ClassA
{       
    [DataMember(Order = 10)]
    public string Code { get; set; }

    [DataMember(Order = 20)]
    public string Symbology { get; set; }

    [DataMember(Order = 30)]
    public string Category { get; set; }

    public string NonMemberPropertyA { get; set; }
}

我有兴趣获得所有DataMember装饰属性:

 var propertyInfos = type.GetProperties().Where(p => Attribute.IsDefined(p, typeof (DataMemberAttribute)));

现在我需要根据propertyInfos属性的Order属性对DataMember进行排序。因为有些可能不正常。

所以我试着添加:

.OrderBy(p => ((DataFormat)Attribute.GetCustomAttribute(p, typeof (DataFormat))).Order);

但我得“无法从使用中推断”错误。

2 个答案:

答案 0 :(得分:2)

这样做:

var propertyInfos = type
            .GetProperties(BindingFlags.Public | BindingFlags.NonPublic)
            .Where(m => m.GetCustomAttributes(typeof(DataMemberAttribute), false).Length > 0)
            .SelectMany(m => m.GetCustomAttributes(false).OfType<DataMemberAttribute>())
            .OrderBy(m => m.Order)
            .ToArray();

答案 1 :(得分:2)

使用它可以使用它:

var orders = a1
    .GetType()
    .GetProperties()
    .Where(x => Attribute.IsDefined(x, typeof(DataMemberAttribute)))
    .Select(x => new { Att = x.GetCustomAttribute<DataMemberAttribute>(true), Prop = x })
    .OrderBy(x => x.Att.Order);

Select()投影一个匿名对象,该对象包含属性本身和属性,以便您可以按属性进行排序。

a1是您的对象ClassA

的一个实例

我修改了你的代码并使其正常工作:

var orders = a1
    .GetType()
    .GetProperties()
    .Where(p => Attribute.IsDefined(p, typeof(DataMemberAttribute)))
    .OrderBy(p => ((DataMemberAttribute)Attribute.GetCustomAttribute(p, typeof(DataMemberAttribute))).Order);