2017-01-13 8 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 ряд) с помощью метода, который имеет параметр - массив объекта.

Я стараюсь делать как код ниже, но это просто добавить каждый из объекта в моем массиве элементов в ячейках таблицы в Excel файл (я уже добавил заголовки в моей таблице данных)

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

Так что мне нужно делать, например, как пропустить мой массив и получить каждое его значение для назначения строке. Ожидаемый результат в моем файле:

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-as/4023521 # 4023521). – Oliver

+0

Вы должны создать собственный класс/структуру для этой цели, вместо использования анонимных типов. – Abion47

+0

Когда вы создаете переменную 'items' _local_ в первой строке, вы можете использовать' var items = new [] {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) раздела MSDN. Однако это может быть улучшено, поскольку оно может попытаться добавить уже существующие столбцы. –

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

  • Нет связанных вопросов^_^