2012-03-14 70 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