给定属性参数顺序的属性排序

时间:2016-09-10 01:43:39

标签: c# sorting properties attributes

我想根据给定的属性参数Order对属性进行排序。

属性:

public class Items: Attribute
{
    public int Order { get; set; }
    public Items(int order)
    { 
      this.Order = order;
    }
}

实施

public class client
{
   [Items(1)]
   public string fName {get; set;}

   [Items(3)]
   public string lName {get; set;}

   [Items(2)]
   public string mName {get; set;}
}

获取所有属性:

var properties = typeof(client).GetProperties().Where(
prop => prop.IsDefined(typeof(Items), false));

按订单排序?

这是我尝试的但它不起作用

Array.Sort(properties, delegate (Items x, Items y) 
{ return x.Order.CompareTo(y.Order); });

如何根据订单对属性进行排序?

这已经解决了,但是想扩展这个问题。

Is there a way to sort properties without having to put an "Order" on them。我想要一个属性“EndOfList”或“Last”,它将确定最后排序。因此,我不必使用Orders使代码混乱。

2 个答案:

答案 0 :(得分:1)

您可以使用Linq和OrderBy

var sorted = properties
    .OrderBy(p => ((Items)p.GetCustomAttributes(true)
                           .FirstOrDefault(a => a is Items)).Order);

这会产生以下顺序:fNamemNamelName

那么OrderBy内部会发生什么:访问自定义属性。查找类型为Items的第一个,并使用Order属性作为排序参数。

要按相反的顺序排序,只需使用OrderByDescending

答案 1 :(得分:1)

你可以试试这个

var properties = typeof(client).GetProperties().Where(prop => prop.IsDefined(typeof(Items), false));
var sortedProperties = properties.OrderBy(x =>  ((Items)x.GetCustomAttributes(typeof(Items), false).FirstOrDefault()).Order);