0

当我遍历一个对象的属性并最终得到一个 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>;
    }
}
4

2 回答 2

3

好吧,你需要一个实例来调用它——大概就是Model.Entity这种情况。你需要GetValue方法。但是,这将非常棘手 - 因为您需要两件事:

  • 您需要可通过以下方式迭代的值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" });
}
于 2011-08-04T20:15:08.217 回答
1

当您说获取“对象的实际属性”时,如果您指的是属性的值,那么您可以执行以下操作。

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

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

编辑:将示例修改为不在foreach@Jon Skeet 中指出的那样,如果没有强制转换,它就无法编译,而且这也是为了演示从PropertyInfo

于 2011-08-04T20:15:30.867 回答