首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net反射GetProperties()

.Net反射GetProperties()
EN

Stack Overflow用户
提问于 2012-03-14 23:06:58
回答 1查看 1.3K关注 0票数 0

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

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

在图形用户界面中,我通过GetProperties()遍历属性,并根据它们的值显示它们。(未显示为空,显示为非空)。

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

所以当我第一次得到"ObjectMetaClassName"=>"ShortName"=>"Name"=>"Url".

随后,我得到了"ObjectMetaClassName"=>"ShortName"=>"Url"=>"Name".

有没有人能解释一下为什么会这样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 23:10:30

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

GetProperties方法不按特定顺序返回属性,如字母顺序或声明顺序。您的代码不能依赖于返回属性的顺序,因为该顺序会有所不同。

如果顺序很重要,也许你应该尝试对结果进行排序?

更新自定义排序

这会增加一些复杂性,但您可以使用属性将自定义排序顺序添加到结果中。首先,创建自定义属性SortOrderAttribute

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Property)]
public sealed class SortOrderAttribute : Attribute
{
    private int _sortOrder;

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

接下来,将该属性应用于您的类的属性:

代码语言:javascript
复制
public class Foo
{
    [SortOrder(1)]
    public int Bar { get; set; }

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

然后是一个IComparer:

代码语言:javascript
复制
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];
    }
}

最后,要获得排序后的列表:

代码语言:javascript
复制
public PropertyInfo[] SortedList()
{
    PropertyInfo[] properties = typeof(Foo).GetProperties();
    Array.Sort(properties, new PropertyInfoComparer());
    return properties;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9704576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档