2009-12-23 92 views
0

我有一個類繼承了另一個類。我想使用反射來遍歷屬性並將值寫入文件。沒問題。除此之外我想控制屬性寫出的順序。有沒有一種乾淨的方式來做到這一點?現在,問題1是子類中的屬性寫出來,然後父類中的proepries寫出來。而且,我可能想要跳過一些屬性或僅對其重新排序。控制返回反射屬性值的順序的最佳方法是什麼?

這裏是我現在的代碼...

foreach (PropertyInfo bp in t.GetProperties()) 
{ 
    Type pt = bp.PropertyType; 

    if ((pt.IsArray) && pt.FullName == "System.Char[]") 
    { 
     char[] caPropertyValue; 
     caPropertyValue = (char[])(bp.GetValue(oBatch, null)); 
     string strPropertyValue = new string(caPropertyValue); 
     myBatch.Add(strPropertyValue); 
    } 
} 
+2

您可以添加一個自定義屬性,該屬性具有您可以設置的某種排序字段,然後使用反射查找該屬性,然後生成這些PropertyInfos/Attribute對的列表並按Order字段排序。 – 2009-12-23 14:08:38

+0

爲什麼你通過評論回答? :) – 2009-12-23 14:13:38

回答

1

你可以創建自己的屬性,即「」「OrderAttribute」「」,並把它放在一個財產 如

public class Man 
{ 
    [Order(0)] 
    string Name {get; set;} 
    [Order(1)] 
    int virtual Age {get; set;} 
} 
public class SuperMan:Man 
{ 
    [Order(-1)] 
    override int Age {get; set;} 
} 

的排序例程,您可以檢查通過pi.GetCustomAttribute順序屬性值()和把pi放在它上面。

3

最簡單的方法是通過他們的名字對它們進行排序 - 按字母順序。您也可以按照他們所屬的課程對他們進行分組,然後按名稱排序每個組。 LINQ使得這種操作相對簡單:

foreach(PropertyInfo bp in t.GetProperties() 
          .OrderBy(p => p.Name) 
{...} 

foreach(PropertyInfo bp in t.GetProperties() 
          .OrderBy(p => p.Name) 
          .GroupBy(p => p.DeclaringType.FullName) 
          .OrderBy(g => g.Key) 
          .SelectMany(g => g)) 
{...} 
+1

除此之外,您還可以使用SortOrderAttribute()或DontExportAttribute()等自定義屬性來修飾屬性,然後調用屬性上的GetCustomAttributes()並執行所需的任何邏輯。 – 2009-12-23 14:12:21

0

檢查出的GetProperties語法。有一個參數可以告訴它你是否只想要當前類的屬性,或者你正在問的是整個繼承鏈的屬性。你將不得不走你的班級結構來找到每個級別的屬性。

相關問題