1

NullReferenceException在以下情况下得到一个

测试类:

[Order(0)]
public class Test
{
    [DisplayName("District Code")]
    [Editable(false)]
    [HiddenInput(DisplayValue = false)]
    public int DistrictCode { get; set; }

    [Required(ErrorMessage = "Error")]
    [Editable(false)]
    [ReadOnly(true)]
    [Order(2)]
    public string Subject { get; set; }
}

自定义订单属性:

public class Order : Attribute
{
    public int Display { get; set; }
    public int Edit { get; set; }
    public int Create { get; set; }

    public Order(int all)
    {
        this.Display = all;
        this.Edit = all;
        this.Create = all;
    }
}

我有以下 foreach 循环(为简洁起见,删除了不相关的代码):

@foreach (PropertyInfo prop in Model.GetType().GetProperties()
         .Where(x => !x.GetCustomAttributes(typeof(HiddenInputAttribute)).Any()))
{
    prop.GetCustomAttributes(typeof(Order), True)
        .GetType().GetProperty("Edit").GetValue(prop);
}

当我快速观看时,prop.GetCustomAttributes(typeof(Order), True).GetType()我得到了我所期望的。但如果我快速观看prop.GetCustomAttributes(typeof(Order), True).GetType().GetProperty("Edit")我会null回来。

为什么反射找不到属性Edit或者这实际上是一个不同的问题

4

1 回答 1

2

问题是我变得.GetCustomAttributes()复数了。因此,.GetType().GetProperty()未打开Order,而是Order[]不包含该属性,Edit因此它为空。所以在 Linq 的一点帮助下,它现在可以工作了。对于那些从谷歌进来的人,我的解决方案如下:

@foreach (PropertyInfo prop in Model.GetType().GetProperties()
    .Where(x => !x.GetCustomAttributes(typeof(HiddenInputAttribute)).Any())
    .OrderBy(x => x.GetCustomAttributes(typeof(Order), true)
    .Select(y => y.GetType().GetProperty("Edit").GetValue(y)).Single()))

我确信可以简化和缩短,但这是一个好的开始。

于 2013-11-14T20:36:58.763 回答