当我通过对象的属性进行操作并最终获得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>;
}
}
答案 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