.Net Reflection GetProperties()

时间:2012-03-14 15:06:58

标签: c# .net wpf

使用Reflection时遇到了一个奇怪的问题。

所以我有一个具有不同属性的域类。根据需要,一些属性被填充,一些属性不被填充。

在GUI中,我通过GetProperties()遍历属性并根据它们的值显示它们。 (显示空未显示,不显示空白。)

但是!第一次迭代属性时,属性的顺序与下一次不同。

所以我第一次得到“ObjectMetaClassName”=>“ShortName”=>“Name”=>“Url”。

随后我得到“ObjectMetaClassName”=>“ShortName”=>“Url”=>“名称”。

有没有人对此有解释,为什么会这样?

1 个答案:

答案 0 :(得分: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;
}