【问题标题】:Sort list of PropertyInfos by property value of its attribute按属性的属性值对 PropertyInfos 列表进行排序
【发布时间】:2015-11-04 16:01:46
【问题描述】:

我有一个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)));

现在我需要根据DataMember 属性的Orderproperty 对propertyInfos 进行排序。因为有些可能出现故障。

所以我尝试添加:

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

但我得到 “无法从使用情况推断” 错误。

【问题讨论】:

    标签: c# linq properties attributes


    【解决方案1】:

    使用这个就可以了:

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

    【讨论】:

    • 模仿猫!开个玩笑。
    • tbh 使用 linq 没有很多不同的方法!因此我们的答案是相似的。我注意到你的一件事是,将 BindingFlags.NonPublic 更改为 BindingFlags.Instance 修复了它。
    【解决方案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();
    

    【讨论】:

    • DataMember 应替换为 DataMemberAttribute
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多