2012-03-14 67 views
0

我在使用Reflection時遇到了一個奇怪的問題。.Net反射GetProperties()

所以我有一個具有不同屬性的域類。根據需要,一些屬性被填充,一些不屬於。

在GUI中,我通過GetProperties()遍歷屬性並根據它們的值顯示它們。 (空沒有顯示,不顯示空)。

但是!第一次迭代屬性時,屬性的順序與下次不同。

所以我第一次得到「ObjectMetaClassName」=>「ShortName」=>「Name」=>「Url」。

後續時間我得到「ObjectMetaClassName」=>「ShortName」=>「Url」=>「Name」。

有沒有人有這方面的解釋,爲什麼會發生這種情況?

+0

如果你發佈了一些代碼,它會更容易理解 – 2012-03-14 15:08:42

+1

如果一件事不能保證任何一種秩序,那麼你很難期待它,並進一步依靠它來做到這一點。 – 2012-03-14 15:09:35

+0

我不能回答你的問題,但這是一個定義的方法的行爲,在這裏描述:http://msdn.microsoft.com/de-de/library/kyaxdd3x.aspx – 2012-03-14 15:10:42

回答

5

http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

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

如果順序很重要,也許你應該嘗試排序結果?

更新自定義排序

這會增加一些複雜性,但您可以添加自定義排序次序使用屬性的結果。首先,創建自定義屬性SortOrderAttribute

[AttributeUsage(AttributeTargets.Property)] 
public sealed class SortOrderAttribute : Attribute 
{ 
    private int _sortOrder; 

    public SortOrderAttribute(int sortOrder) 
    { 
     _sortOrder = sortOrder; 
    } 
} 

下適用該屬性對你的類屬性:

public class Foo 
{ 
    [SortOrder(1)] 
    public int Bar { get; set; } 

    [SortOrder(2)] 
    public string Name { get; set; } 
} 

然後作爲IComparer:

public class PropertyInfoComparer : IComparer<PropertyInfo> 
{ 
    public int Compare(PropertyInfo a, PropertyInfo b) 
    { 
     return a.GetCustomAttributes(typeof(SortOrderAttribute), false)[0] - b.GetCustomAttributes(typeof(SortOrderAttribute), false)[0]; 
    } 
} 

最後,得到的分類列表:

public PropertyInfo[] SortedList() 
{ 
    PropertyInfo[] properties = typeof(Foo).GetProperties(); 
    Array.Sort(properties, new PropertyInfoComparer()); 
    return properties; 
} 
+0

我想要他們,因爲他們是定義在我的領域類。但是,感謝您的快速響應。我一定錯過了MSDN上的那一段。我想不出什麼。 – 2012-03-14 15:14:41

+0

我用一種方式更新了我的答案,例如你可能會得到你想要的東西。 – 2012-03-14 15:34:14