如何从PropertyInfo访问对象的属性?

时间:2011-08-04 20:12:18

标签: c# reflection propertyinfo getproperties

当我通过对象的属性进行操作并最终获得PropertyInfo时,如何访问对象的实际属性?

@foreach(var propertyInfo in Model.Entity.GetType().GetProperties()) {
    if (propertyInfo.PropertyType != typeof(string) &&
        propertyInfo.PropertyType.GetInterface(typeof(IEnumerable<>).Name) != null) {
        <div>
            @foreach(var item in propertyInfo/*Need Actual Property Here*/) {
                @Html.Action("Edit", new { Id = item.Id, typeName = "Item" });
            }
        </div>;
    }
}

2 个答案:

答案 0 :(得分:3)

嗯,你需要一个实例来调用它 - 在这种情况下可能是Model.Entity。您需要the GetValue method。但是,它会非常棘手 - 因为你需要两件事:

  • 您需要foreach
  • 可以迭代该值
  • 您需要每个item都拥有Id属性。

如果您使用的是C#4和.NET 4,则可以使用动态类型使其更简单:

IEnumerable values = (IEnumerable) propertyInfo.GetValue(Model.Entity, null);
@foreach(dynamic item in values) {
    @Html.Action("Edit", new { Id = item.Id, typeName = "Item" });
}

甚至:

dynamic values = propertyInfo.GetValue(Model.Entity, null);
@foreach(dynamic item in values) {
    @Html.Action("Edit", new { Id = item.Id, typeName = "Item" });
}

答案 1 :(得分:1)

当你说“获取对象的实际属性”时,如果你指的是属性的值,那么你可以做类似下面的事情。

var item = in propertyInfo.GetValue(Model.Entity, null);

但是,如果您没有解析正确的类型(在上面的示例中使用var进行推理时应该是对象),则无法访问该值的Id属性进一步反映或访问数据的不同动态方法。

编辑:将示例修改为不在foreach中,因为@Jon Skeet指出它不会在没有强制转换的情况下进行编译,而且这也是为了演示从PropertyInfo