2017-01-25 10 views
1

リフレクションを使用してデータリストビューからリンクリストを更新しようとしているため、各プロパティのコード行を記述する必要はありません。クラスプロパティを取得して使用するリフレクション

クラス:

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; } 
} 

プロパティごとに1行のコードが動作します。

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データソースはリンクリストから来るバインディングリストです。リンクリストはdgvに直接バインドされていません – Zeus

答えて

1

BindingSourceを使用することをお勧めします。この方法では、グリッドで変更された値は、自動的にあなたのリストに変更されます:

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

dataGridView1.DataSource = bs; 

これは、手動でグリッドに変更した値を更新する場合を解決するだろう。

+0

コードを試してみてください – Zeus

+0

ありがとうございます、その作業 - 私はそう簡単な解決策はないと思いました。 – Zeus

+0

@ゼウスあなたは大歓迎です。私はそれを自分自身が遭遇するまでどちらもしなかった。その前に私は手作業でループして値を探していました。 –

2

リフレクションベースのループは、別の構文を使用する必要がある:

  • プロパティの型は、PropertyInfoの特性である、
  • ConvertSystem.TypeかかりChangeType方法を有し、
  • プロパティの割り当てをする必要があります呼び出しによって行われるSetValue

したがって、ループはli

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

本当にありがとうございました。申し訳ありません - 私は1つの答えしか受け入れることができません、そして、モンの答えはより簡単ですが、私はあなたの返信をupvotedし、他の場所でコードを使用します。 – Zeus

関連する問題