2010-02-09 46 views
5

我正在c#.NEt 2.0中工作。我有一個班,讓我們說X與許多屬性。每個屬性都有一個自定義屬性,一個整型,我打算用它來指定它在最終數組中的順序。如何基於自定義屬性對通用列表進行排序?

使用反射我通讀了所有的屬性,並將這些值分組並將它們放置到屬性的通用列表中。這工作,我可以抓住價值觀。但是該計劃是基於放置在每個屬性上的自定義屬性對列表進行排序,並最終將已經訂購的運算值讀入字符串中。

回答

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 2010-02-09 19:42:21

+0

@Argons可用,右看過去的2.0限制。將更新 – JaredPar 2010-02-09 20:05:45

+0

如果我只想得到Sort屬性的屬性?而不是代碼缺少驗證,沒有兩個屬性具有相同的順序? – gdoron 2011-11-21 06:05:45

相關問題