使用反射按顺序获取类的属性

Siv*_*ini 3 c# linq reflection c#-4.0

请参考此代码

public class A : B
{
     [Display(Name = "Initial Score Code", Order =3)]
     public Code { get; set; }

     [Display(Name = "Initial Score Code", Order =2)]
     public Name{ get; set; }
............

}
Run Code Online (Sandbox Code Playgroud)

我需要通过order的orderAttribute按顺序获取类的所有属性.我试过这个代码

 var prop = typeof(A)
            .GetProperties()
            .OrderBy(p => ((DisplayAttribute)p.GetCustomAttributes(typeof(DisplayAttribute),  true).FirstOrDefault).Order);
Run Code Online (Sandbox Code Playgroud)

但它会导致错误

对象引用不设置对象的实例

我假设这个问题是因为某些属性在"DisplayAttribute"中没有"Order"属性.

如何处理这种情况?我需要订购所有属性,即使某些属性没有order属性的值.

Ser*_*kiy 7

()FirstOrDefault操作员上缺少括号.此外,您应该在返回默认值时处理大小写.我建议Order在获得第一个或默认值之前选择值.这将返回0所有没有的属性DisplayAttribute:

var prop = typeof(A)
    .GetProperties()
    .OrderBy(p => p.GetCustomAttributes(typeof(DisplayAttribute), true)
                   .Cast<DisplayAttribute>()
                   .Select(a => a.Order)
                   .FirstOrDefault());
Run Code Online (Sandbox Code Playgroud)

如果您希望没有DisplayAttribute的属性为last,则可以提供Int32.MaxValue要返回的默认值:

                   .Select(a => a.Order)
                   .DefaultIfEmpty(Int32.MaxValue)
                   .First()
Run Code Online (Sandbox Code Playgroud)