![](/img/trans.png)
[英]Using GetProperties() with BindingFlags.DeclaredOnly in .NET Reflection
[英].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.