我有一个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);
但我得“无法从使用中推断”错误。
答案 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);