2017-01-13 10 views
0

に配列匿名オブジェクト内の各値を取得することができます私はこのはどのように私はC#の

var items = new object[] 
{ 
    new {name= "house",code=1,price= 30}, 
    new {name= "water",code=2,price= 323}, 
    new {name= "food",code=3,price= 45} 
}; 

のようなオブジェクトの配列を持っている私は、(データ表の行にこれらの値のそれぞれを追加したいので、1つのオブジェクト - 1行)は、パラメータを持つメソッドを介してオブジェクトの配列です。だから、

public void Create(object[] items) 
{ 
    // table headers are created before this line....... 
    var table = new DataTable(); 
    table.Rows.Add(items); 
} 

(私はすでに私のデータテーブルにヘッダを追加しました)

は、私は以下のコードのように実行しようが、それは単にExcelファイル内のテーブルセルに私の項目の配列内のオブジェクトのそれぞれを追加します私が何をする必要があるか、どのように私の配列をループして、行に割り当てるために各値を得るかのように。私のファイルに 期待される結果:

Name Code Price 
=================== 
house 1  30 
water 2  323 
food 3  45 

ありがとう(と私の質問は、十分に明確でない場合はコメントしてください)

+0

たぶん、[この回答](http://stackoverflow.com/questions/4023462/how-do-i-automatically-display-all-properties-of- a-class-and-their-values-in/4023521#4023521)が役立ちます。 – Oliver

+0

匿名型を使用する代わりに、この目的のために独自のクラス/構造体を実際に作成する必要があります。 – Abion47

+0

最初の行に_local_変数 'items'を作成すると、' var {new {name = "house"、code = 1、price = 30}、/ * ... * /} 'を呼び出すと、匿名オブジェクトの配列に強く型付けされます。しかし、 'Create'のようなメソッドに渡すとすぐに、匿名型の名前がないので強く型付けすることができないので、メソッドのシグネチャでそれを記述することはできません。その場合、@ Abion47のコメントを考えてみてください。 –

答えて

0

あなたが最初の列を追加する必要があります。

var table = new DataTable(); 
table.Columns.Add("name"); 
table.Columns.Add("code"); 
table.Columns.Add("price"); 

foreach (var item in items) 
{ 
    table.Rows.Add(item); 
} 
+0

それは匿名のタイプです、あなたは小道具に直接アクセスすることはできません。 – niksofteng

1

あなたは、リフレクションを使用することができます。

var table = new DataTable(); 
table.Columns.Add("name", typeof(string)); 
table.Columns.Add("code", typeof(int)); 
table.Columns.Add("price", typeof(double)); 

foreach(var obj in items) { 
    var row = table.NewRow(); 
    row["name"] = obj.GetType().GetProperty("name").GetValue(obj, null); 
    row["code"] = obj.GetType().GetProperty("code").GetValue(obj, null); 
    row["price"] = obj.GetType().GetProperty("price").GetValue(obj, null); 
    table.Rows.Add(row); 
} 
2

あなたは完全に再利用可能なメソッドを書くこと

public void Create<T>(T[] items) 
{ 

    var table = new DataTable(); 
    var props = typeof(T).GetProperties(); 
    // Dynamically create headers 
    foreach(var p in props) 
    { 
     if(!table.Columns.Contains(p.Name)) 
      table.Columns.Add(p.Name, p.ReturnType); 
    } 

    // Dynamically add values 
    foreach(var o in items) 
    { 
     var row = table.NewRow(); 
     foreach(var p in props) 
     { 
      row[p.Name] = p.GetValue(o); 
     } 
     table.Rows.Add(row); 
    } 
} 

を行う必要があります。列の

EDIT 改善された動的な作成

+0

@ Abion47それは本当にシンプルなコードですが、ここではあなたが行く.. –

+0

有望に見える、私はそれを試してみましょう。ありがとう – TranQ

+0

@ Abion47冗長性ではありません。私は列を作成し、次に行を作成します。 [備考](https://msdn.microsoft.com/en-us/library/system.data.datatable.rows(v = vs.110)を参照してください。aspx)セクションを参照してください。ただし、既存の列を追加しようとする可能性があるため、これは改善される可能性があります。 –