2017-01-25 10 views
1

Я пытаюсь обновить связанный список из datagridview с использованием отражения, поэтому мне не нужно писать строку кода для каждого свойства.Отражение для получения и использования свойств класса

Класс:

public class clsUnderlying 
{ 
    public int UnderlyingID { get; set; } 
    public string Symbol { get; set; } 
    public double RiskFreeRate { get; set; } 
    public double DividendYield { get; set; } 
    public DateTime? Expiry { get; set; } 
} 

Одна строки коды в собственность работы:

UdlyNode.Symbol = (string)GenericTable.Rows[IDX].Cells["Symbol"].Value; 
UdlyNode.Expiry = (DateTime)GenericTable.Rows[IDX].Cells["Expiry"].Value; 
etc. 

Но есть много классов и свойств класса, поэтому я предпочел бы использовать цикл и отражение, но я не уверен, как, и моя попытка ниже имеет ошибки.

PropertyInfo[] classProps = typeof(GlobalVars.clsUnderlying).GetProperties(); 
foreach (var Prop in classProps) 
{ 
    Type T = GetType(Prop); // no overload for method GetType 
    UdlyNode.Prop.Name = Convert.T(GenericTable.Rows[IDX].Cells[Prop.Name].Value); // error on "Prop.Name" and "T.(" 
} 

Спасибо за любые предложения или ссылки для дальнейшего понимания.

+0

У вас есть список, связанный как 'DataSource' с' DataGridView'? –

+0

dgv datasource является списком привязки, который исходит из связанного списка. Связанный список напрямую связан с dgv – Zeus

ответ

1

Я бы предложил использовать BindingSource. Таким образом, измененное значение в сетке будет автоматически изменяться в списке:

BindingSource bs = new BindingSource(); 
bs.DataSource = yourList; 

dataGridView1.DataSource = bs; 

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

+0

. Спасибо, я попробую код – Zeus

+0

Спасибо, его работа - я не думал, что существует такое простое решение. – Zeus

+0

@ Zeus Вы добро пожаловать. Я не сделал этого, пока не наткнулся на него. До этого я вручную зацикливал и искал значения. –

2

Отражения на основе цикла необходимо использовать другой синтаксис:

  • Вид недвижимости является собственностью PropertyInfo,
  • Convert имеет ChangeType метод, который принимает System.Type и
  • нужно назначения
  • собственности будет сделано по телефону SetValue

Следовательно, ваша петля будет выглядеть li ke this:

foreach (var p in classProps) { 
    p.SetValue(
     UdlyNode 
    , Convert.ChangeType(
      GenericTable.Rows[IDX].Cells[p.Name].Value 
     , p.PropertyType 
     ) 
    ); 
} 
+0

Спасибо, что действительно помогает мне лучше понять рефлексию. Извините, я могу принять только один ответ, и ответ Монжа проще, но я подтвердил ваш ответ и буду использовать код в другом месте. – Zeus