Как я могу получить доступ к свойству объекта из PropertyInfo? - PullRequest
0 голосов
/ 05 августа 2011

Когда я рассматриваю свойства объекта и получаю 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 ]

3 голосов
/ 05 августа 2011

Ну, вам нужен экземпляр для его вызова - предположительно, в данном случае это 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" });
}
1 голос
/ 05 августа 2011

Когда вы говорите, получите «фактическое свойство объекта», если вы ссылаетесь на значение свойства, тогда вы можете сделать что-то вроде ниже.

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

Однако, если у вас не будет разрешен правильный тип (который должен быть объектом в приведенном выше примере с использованием var для вывода), вы не сможете получить доступ к свойству Id значения без дальнейшего отражения или другой динамический метод доступа к данным.

Редактировать: изменил пример, чтобы он не входил в foreach, так как @Jon Skeet указал, что он не будет компилироваться без приведения, и это также демонстрирует получение значения из PropertyInfo

...