给岁月以文明,而不是给文明以岁月

文章分类

关于博主

头像不见了

C# GetProperties() 顺序问题


/ 阅读 198

C# 可以通过反射获取到类型信息,比如获取类中定义的属性,使用Type类型的GetProperties(), 该方法返回的是一个数组PropertyInfo[]。最近在工作中发现了每次获取的数组中属性的顺序和类中定义的顺序不一定一致导致的一个bug。查阅 msdn 发现文档中已经说明了这个问题,该方法并不保证按照特定的顺序返回。实际发现,大部分情况都是按照定义顺序返回,偶尔出现不一致的情况,所以写代码的时候没注意到这个问题。

我们可以可以使用特性Attribute来解决这个问题。

1、定义一个特性表示属性顺序

public class PropertyOrderAttribute : Attribute
{
    public int Order { get; private set; }
    public PropertyOrderAttribute(int order)
    {
        Order = order;
    }
}

2、给属性加上特性

public class Test 
{
    [PropertyOrder(1)]
    public int Property1 { get; set; }

    [PropertyOrder(2)]
    public int Property2 { get; set; }

    [PropertyOrder(3)]
    public int Property3 { get; set; }
}

3、给PropertyInfo写个扩展方法获取排序顺序

public static class ExtendMethods 
{
    public static int PropertyOrder(this PropertyInfo propertyInfo)
    {
        var orderAttr = (PropertyOrderAttribute)propertyInfo.GetCustomAttributes(typeof(PropertyOrderAttribute), true).SingleOrDefault();
        var order = orderAttr != null ? orderAttr.Order : Int32.MaxValue;
        return order;
    }
}

4、获取属性时按照设定顺序排个序

PropertyInfo[] propertyInfos = typeof(T).GetProperties().OrderBy(p => p.PropertyOrder()).ToArray();

思路如此,根据实际情况决定如何排序。

Java中的反射也有类似的问题,解决方法也类似,使用java的注解即可。