2013-07-17 4 views
2

Я пытаюсь создать таблицу в виде бритвы, используя отражение, чтобы вытащить свойства из модели.C# отражение использовать переменную как объект. [Var]

Вот что я пробовал:

@if (@Model.Count() > 0) 
{ 
    System.Reflection.PropertyInfo[] properties = Model.First().GetType().GetProperties(); 
    <table> 
     <thead> 
      <tr> 

      @foreach (var property in properties) 
      { 
       if (char.IsLower(property.Name.ToCharArray()[0])) //ignore foreign keys 
       { 
        continue; 
       } 
       <th>@property.Name</th> 
      } 
      </tr> 
     </thead> 
     <tbody> 
      @foreach (PCNWeb.Models.Switch item in Model) 
      { 
       /*System.Reflection.PropertyInfo[]*/ properties = item.GetType().GetProperties(); 
       <tr> 
       @foreach (var property in properties) 
       {      
        <td> 
         @Html.DisplayFor(modelItem => item.[property.Name]) 
        </td> 
       } 
       </tr> 

      } 
     </tbody> 
    </table> 
} 

Позвольте мне указать ту часть кода, я не уверен, что делать с:

<td> 
    @Html.DisplayFor(modelItem => item.[property.Name]) 
</td> 

property.Name содержит имя свойства элемента, к которому я хочу получить доступ. Если бы я рукописный сокровенное td один пример будет:

<td> 
    @Html.DisplayFor(modelItem => item.Switch_Location) 
</td> 

где "Switch_Location" этого значение property.Name

Поэтому в основном мне нужно получить доступ к значению свойства пункта на основе имени свойства, хранящегося в переменной.


EDIT Добавление Модель:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace PCNWeb.Models 
{ 
    public partial class Switch 
    { 
     public Switch() 
     { 
      this.Ports = new List<Port>(); 
      this.Switch_Location = new Switch_Location(); 
      this.Switch_Model = new Switch_Model(); 
      this.UPS = new UPS(); 
     } 
     [Key] 
     public int switchRecId { get; set; } 
     [Required] 
     public int locationRecId { get; set; } 
     [Required] 
     public int modelRecId { get; set; } 
     //public int gatewayRecId { get; set; } 
     [Required] 
     public int upsRecId { get; set; } 
     [Required] 
     public int Number { get; set; } 
     [Required] 
     [StringLength(64)] 
     public string Name { get; set; } 
     [StringLength(80)] 
     public string Description { get; set; } 

     [StringLength(32)] 
     public string Cabinet { get; set; } 

     [StringLength(40)] 
     public string Power_Feed { get; set; } 
     [Required] 
     public Nullable<int> ipOctet1 { get; set; } 
     [Required] 
     public Nullable<int> ipOctet2 { get; set; } 
     [Required] 
     public Nullable<int> ipOctet3 { get; set; } 
     [Required] 
     public Nullable<int> ipOctet4 { get; set; } 

     public virtual ICollection<Port> Ports { get; set; } 
     public virtual Switch_Location Switch_Location { get; set; } 
     public virtual Switch_Model Switch_Model { get; set; } 
     public virtual UPS UPS { get; set; } 
    } 
} 
+3

Могу я предложить использовать модель? –

+0

@ DanielA.White Какая доза при использовании ViewModel мне нужна? Мне очень нравится идея иметь наименьшее количество рукописного кода, таким образом, такой подход. – TechplexEngineer

+2

разделение проблем. ваш код теряет ремонтопригодность. –

ответ

4

Поэтому в основном мне нужно для доступа к значению свойства элемента на основе имени свойства, хранящегося в переменной.

Нет, вам необходимо получить доступ к значению свойства на основе объекта PropertyInfo, описывающего его. Это намного проще.

property.GetValue(item) 
+0

using property.GetValue (item) дает следующее: '' 'PCNWeb.Models.Switch_Location''' в моем datatable. Есть ли способ получить фактические данные? – TechplexEngineer

+0

Это должно дать фактические данные. –

+3

@TechplexEngineer: Я думаю, что ваш 'Html.DisplayFor' вызывает' ToString() 'на объекте. Если вы хотите изменить строку, напишите лучший 'Switch_Location.ToString()' –

0

Если вы действительно не нужен метод Displayfor, вы можете сделать это, как это в цикле:

<tbody> 
      @foreach (PCNWeb.Models.Switch item in Model) 
      { 
       /*System.Reflection.PropertyInfo[]*/ properties = item.GetType().GetProperties(); 
       <tr> 
       @foreach (var property in properties) 
       {      
        <td> 
         @property.GetValue(item,null) 
        </td> 
       } 
       </tr> 

      } 
     </tbody> 
+0

В таблице это просто печать свойстваName, я пытался использовать DisplayFor для получения свойстваValue. Как я могу получить доступ к базовым данным? – TechplexEngineer

+0

Как насчет этого? См. Правки. – Botonomous

+1

Вам нужно '@' перед 'item' в вашем редактировании. –

Смежные вопросы