2013-03-20 42 views
1

根据MSDN是否可以使用属性对Type.GetProperties()返回的类型属性进行排序?

Type.GetProperties() 所述的GetProperties方法不以特定的顺序返回的属性,如字母或声明顺序。您的代码不得依赖于返回属性的顺序,因为顺序会有所不同。

可以以某种方式注解属性(自定义属性,也许),以便你可以做这样的事情?

var properties = typeof(myClass).GetProperties() 
.AsEnumerable().OrderBy(Func<VoodooOrdinalAttribute>); 

public class MyClass 
{ 
    [VoodooOrdinalAttribute(2)] public string Color { get; set;} 
    [VoodooOrdinalAttribute(3)] public string Shape { get; set;} 
    [VoodooOrdinalAttribute(1)] public string Mass { get; set;} 
} 

public class VoodooOrdinalAttribute : Attribute 
{ 
    public VoodooOrdinalAttribute(int ordinal) 
    { 
     this.Ordinal = ordinal; 
    } 
    public int Ordinal { get; set; } 
} 

,并期望性的判定顺序是

  1. 质量
  2. 颜色
  3. 形状

回答

3

是的,你可以使用属性命令属性。如果您在您的示例中使用类似于您的用法定义属性,则这是一个LINQ查询,该查询用属性中指定的数字来排序具有该属性的属性。

var propertyData = from prop in typeof(MyClass).GetProperties() 
        let voodooOrdinalAttribute = Attribute.GetCustomAttribute(prop, typeof(VoodooOrdinalAttribute)) as VoodooOrdinalAttribute 
        where voodooOrdinalAttribute != null 
        let lineOrder = voodooOrdinalAttribute.Ordinal 
        orderby lineOrder ascending 
        select prop; 
+0

我编辑了我的问题,包括VoodooOrdinalAttribute实现。你的查询如何按照属性构造函数参数和/或属性指定的顺序进行拾取? – Jeff 2013-03-20 21:47:34

+0

对于每个属性,它都获得属性(首先让表达式)。然后它执行一个空的检查(where子句),然后从该属性的属性实例(第二个let表达式)获取序号。最后,它按升序排列属性(orderby子句),然后选择属性(select子句)。 – JKor 2013-03-20 22:30:41

+0

啊......知道了。 '.Ordinal'是你在属性上赋予属性的名称。我会更新我的问题。干得不错! – Jeff 2013-03-20 22:58:19

相关问题