5
我正在c#.NEt 2.0中工作。我有一個班,讓我們說X與許多屬性。每個屬性都有一個自定義屬性,一個整型,我打算用它來指定它在最終數組中的順序。如何基於自定義屬性對通用列表進行排序?
使用反射我通讀了所有的屬性,並將這些值分組並將它們放置到屬性的通用列表中。這工作,我可以抓住價值觀。但是該計劃是基於放置在每個屬性上的自定義屬性對列表進行排序,並最終將已經訂購的運算值讀入字符串中。
我正在c#.NEt 2.0中工作。我有一個班,讓我們說X與許多屬性。每個屬性都有一個自定義屬性,一個整型,我打算用它來指定它在最終數組中的順序。如何基於自定義屬性對通用列表進行排序?
使用反射我通讀了所有的屬性,並將這些值分組並將它們放置到屬性的通用列表中。這工作,我可以抓住價值觀。但是該計劃是基於放置在每個屬性上的自定義屬性對列表進行排序,並最終將已經訂購的運算值讀入字符串中。
比方說,你有以下屬性定義
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>();
}
你的答案適用於C#3 +和LINQ至極不在框架2.0 – Argons 2010-02-09 19:42:21
@Argons可用,右看過去的2.0限制。將更新 – JaredPar 2010-02-09 20:05:45
如果我只想得到Sort屬性的屬性?而不是代碼缺少驗證,沒有兩個屬性具有相同的順序? – gdoron 2011-11-21 06:05:45