如何根据自定义属性对通用列表进行排序?

5
我正在使用c#.NET 2.0进行工作。我有一个类,我们称之为X,它有许多属性。每个属性都有一个自定义属性,即一个整数,我计划使用它来指定其在最终数组中的顺序。
使用反射,我遍历所有属性并将值分组,并将它们放入属性的通用列表中。这起作用了,我可以抓取到这些值。但是我的计划是根据放置在每个属性上的自定义属性对列表进行排序,最后将已排序的属性值读出到字符串中。
1个回答

11

假设您有以下属性定义:

public class SortAttribute : Attribute { 
  public int Order { get; set; }
  public SortAttribute(int order) { Order = order; }
}
你可以使用以下代码按排序顺序提取类型中的属性,当然前提是它们都有此属性。
public IEnumerable<object> GetPropertiesSorted(object obj) {
  Type type = obj.GetType();
  List<KeyValuePair<object,int>> list = new List<KeyValuePair<object,int>>();
  foreach ( PropertyInfo info in type.GetProperties()) {
    object value = info.GetValue(obj,null);
    SortAttribute sort = (SortAttribute)Attribute.GetCustomAttribute(x, typeof(SortAttribute), false);
    list.Add(new KeyValuePair<object,int>(value,sort.Order));
  }
  list.Sort(delegate (KeyValuePair<object,int> left, KeyValuePair<object,int> right) { left.Value.CompareTo right.Value; });
  List<object> retList = new List<object>();
  foreach ( var item in list ) {
    retList.Add(item.Key);
  }
  return retList;
}

LINQ风格的解决方案

public IEnumerable<string> GetPropertiesSorted(object obj) {
  var type = obj.GetType();
  return type
    .GetProperties()
    .Select(x => new { 
      Value = x.GetValue(obj,null),
      Attribute = (SortAttribute)Attribute.GetCustomAttribute(x, typeof(SortAttribute), false) })
    .OrderBy(x => x.Attribute.Order)
    .Select(x => x.Value)
    .Cast<string>();
}

2
你的答案适用于C#3+和linq,但在2.0框架中不可用。 - Argons
如果我只想获取具有排序属性的属性?代码是否缺少验证,以确保没有两个具有相同顺序的属性? - gdoron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接