2010-02-09 9 views
5

Sto lavorando in C# .NEt 2.0. Ho una classe, diciamo X con molte proprietà. Ogni proprietà ha un attributo personalizzato, un interger, che ho pianificato di usare per specificare il suo ordine nell'array finale.Come si ordina un elenco generico basato su un attributo personalizzato?

Utilizzo della riflessione Ho letto tutte le proprietà e raggruppo i valori e li inserisco in un elenco generico di proprietà. Funziona e posso afferrare i valori. Ma il piano era ORDINA l'elenco, basato sull'attributo personalizzato posto su ogni proprietà, e infine legge i valori appropriati, già ordinati, in una stringa.

risposta

11

Diciamo che avete avuto la seguente definizione di attributo

public class SortAttribute : Attribute { 
    public int Order { get; set; } 
    public SortAttribute(int order) { Order = order; } 
} 

È possibile utilizzare il seguente codice per tirare fuori le proprietà su un tipo in modo ordinato. Supponendo, naturalmente, tutti hanno questo attributo Soluzione

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 Stile

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

La tua risposta lavora per C# 3 + e LINQ wich non è disponibile nel quadro 2.0 – Argons

+0

@Argons, leggere a destra oltre il 2.0 restrizione. Aggiornerà – JaredPar

+0

Se voglio ottenere solo attributi con l'attributo Sort? E il codice non manca la convalida che non ci sono due proprietà con lo stesso ordine? – gdoron

Problemi correlati