2013-03-20 61 views
1

根據MSDN是否可以使用屬性對Type.GetProperties()返回的類型屬性進行排序?

Type.GetProperties() 所述的GetProperties方法不以特定的順序返回的屬性,如字母或聲明順序。您的代碼不得依賴於返回屬性的順序,因爲順序會有所不同。

可以以某種方式註解屬性(自定義屬性,也許),以便你可以做這樣的事情?

var properties = typeof(myClass).GetProperties() 
.AsEnumerable().OrderBy(Func<VoodooOrdinalAttribute>); 

public class MyClass 
{ 
    [VoodooOrdinalAttribute(2)] public string Color { get; set;} 
    [VoodooOrdinalAttribute(3)] public string Shape { get; set;} 
    [VoodooOrdinalAttribute(1)] public string Mass { get; set;} 
} 

public class VoodooOrdinalAttribute : Attribute 
{ 
    public VoodooOrdinalAttribute(int ordinal) 
    { 
     this.Ordinal = ordinal; 
    } 
    public int Ordinal { get; set; } 
} 

,並期望性的判定順序是

  1. 質量
  2. 顏色
  3. 形狀

回答

3

是的,你可以使用屬性命令屬性。如果您在您的示例中使用類似於您的用法定義屬性,則這是一個LINQ查詢,該查詢用屬性中指定的數字來排序具有該屬性的屬性。

var propertyData = from prop in typeof(MyClass).GetProperties() 
        let voodooOrdinalAttribute = Attribute.GetCustomAttribute(prop, typeof(VoodooOrdinalAttribute)) as VoodooOrdinalAttribute 
        where voodooOrdinalAttribute != null 
        let lineOrder = voodooOrdinalAttribute.Ordinal 
        orderby lineOrder ascending 
        select prop; 
+0

我編輯了我的問題,包括VoodooOrdinalAttribute實現。你的查詢如何按照屬性構造函數參數和/或屬性指定的順序進行拾取? – Jeff 2013-03-20 21:47:34

+0

對於每個屬性,它都獲得屬性(首先讓表達式)。然後它執行一個空的檢查(where子句),然後從該屬性的屬性實例(第二個let表達式)獲取序號。最後,它按升序排列屬性(orderby子句),然後選擇屬性(select子句)。 – JKor 2013-03-20 22:30:41

+0

啊......知道了。 '.Ordinal'是你在屬性上賦予屬性的名稱。我會更新我的問題。幹得不錯! – Jeff 2013-03-20 22:58:19

相關問題