繁体   English   中英

.Net反射GetProperties()

[英].Net Reflection GetProperties()

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

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

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

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

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

随后,我得到“ ObjectMetaClassName” =>“ ShortName” =>“ Url” =>“ Name”。

有人对此有解释吗,为什么会发生?

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM