将对象展开到数据表

本文关键字:数据表 对象 | 更新日期: 2023-09-27 18:33:13

我是新的ExpandoObject(事实上,我昨天发现了它)。我有以下代码,想知道是否有某种方法可以将 ExpandoObject 转换为我不知道的数据表?还是我必须使用反射来自己转换它?

dynamic contacts = new List<dynamic>();
contacts.Add(new ExpandoObject());
contacts[0].Name = "Patrick Hines";
contacts[0].Phone = "206-555-0144";
contacts.Add(new ExpandoObject());
contacts[1].Name = "Ellen Adams";
contacts[1].Phone = "206-555-0155";

将对象展开到数据表

这是我

必须转换它的内容。但如果有人有更好的方法,请告诉我。

    public DataTable ToDataTable(IEnumerable<dynamic> items)
    {
        var data = items.ToArray();
        if (data.Count() == 0) return null;
        var dt = new DataTable();
        foreach (var key in ((IDictionary<string, object>)data[0]).Keys)
        {
            dt.Columns.Add(key);
        }
        foreach (var d in data)
        {
            dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
        }
        return dt;
    }
您可以使用

此代码。Linq 将帮助您:)

var contacts = new List<dynamic>();
contacts.Add(new ExpandoObject());
contacts[0].Name = "Patrick Hines";
contacts[0].Phone = "206-555-0144";
contacts.Add(new ExpandoObject());
contacts[1].Name = "Ellen Adams";
contacts[1].Phone = "206-555-0155";
// DataTable Instance...
DataTable table = new DataTable();
//Get all properties of contract list items
var properties = contacts.GetType().GetProperties();
// Remove contract list property
properties = properties.ToList().GetRange(0, properties.Count() - 1).ToArray();
// Add column as named by property name
properties.ToList().ForEach(p => table.Columns.Add(p.Name,typeof(string)));
// Add rows from contracts list
contacts.ForEach(x =>  table.Rows.Add(x.Name,x.Phone));