C# .Net反射GetProperties()

C# .Net反射GetProperties(),c#,.net,wpf,C#,.net,Wpf,我在使用反射时遇到了一个奇怪的问题 所以我有一个具有不同属性的域类。根据需要,某些属性已填充,而某些属性未填充 在GUI中,我通过GetProperties()遍历属性,并根据它们的值显示它们。(未显示为空,未显示为空) 但是!第一次迭代属性时,属性的顺序与下一次不同 所以我第一次得到“ObjectMetaClassName”=>“ShortName”=>“Name”=>“Url” 随后,我得到“ObjectMetaClassName”=>“ShortName”=>“Url”=>“Name” 有

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

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

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

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

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

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

有人对此有解释吗?为什么会发生这种情况?

来自:

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];
    }
}
发件人:

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

如果你发布一些代码,你会更容易理解如果一件事情不能保证任何形式的秩序,那么你很难期望它,并进一步依赖它这样做。我不能回答你的问题,但这是该方法的一个定义行为,这里描述:如果你发布一些代码,那么就更容易理解如果一件事情不能保证任何类型的顺序,那么你就很难期望它,并进一步依赖它这样做。我不能回答你的问题,但这是该方法的定义行为,这里描述:我希望它们在我的域类中定义。但是谢谢你的快速回复。我一定错过了MSDN上的那一段。我会想办法的。我用一个例子更新了我的答案,说明了一种可能让你得到你想要的东西的方法。我希望它们是在我的域类中定义的。但是谢谢你的快速回复。我一定错过了MSDN上的那一段。我会想办法的。我用一个例子更新了我的答案,说明了一种可能让你得到你想要的东西的方法。