如何在c#中的数组匿名对象中获取每个值?

时间:2017-01-13 07:38:39

标签: c# excel model-view-controller datatable anonymous-types

我有一个像这样的对象数组

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行),该方法的参数是一个对象数组。

我尝试像下面的代码那样做,但它只是将我的items数组中的每个对象添加到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

谢谢(如果我的问题不够明确,请发表评论)

3 个答案:

答案 0 :(得分: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);
    }
}

编写一个完全可重用的方法。

修改 改进了列的动态创建

答案 1 :(得分: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 :(得分: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);
}