C# ExpandoObject到DataTable

C# ExpandoObject到DataTable,c#,datatable,converter,expandoobject,C#,Datatable,Converter,Expandoobject,我是一个新的ExpandoObject(事实上,我昨天就知道了)。我有下面的代码,想知道是否有某种方法可以将ExpandooObject转换为我不知道的DataTable?或者我必须使用反射来转换它 dynamic contacts = new List<dynamic>(); contacts.Add(new ExpandoObject()); contacts[0].Name = "Patrick Hines"; contacts[0].Phone = "206-555-014

我是一个新的ExpandoObject(事实上,我昨天就知道了)。我有下面的代码,想知道是否有某种方法可以将ExpandooObject转换为我不知道的DataTable?或者我必须使用反射来转换它

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";
dynamic contacts=new List();
contacts.Add(新的expandooobject());
联系人[0]。Name=“Patrick Hines”;
联系人[0]。电话=“206-555-0144”;
contacts.Add(新的expandooobject());
联系人[1]。姓名=“艾伦·亚当斯”;
联系人[1]。电话=“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;
    }
公共数据表到数据表(IEnumerable items)
{
var data=items.ToArray();
if(data.Count()==0)返回null;
var dt=新数据表();
foreach(变量键入((IDictionary)数据[0]).Keys)
{
dt.Columns.Add(键);
}
foreach(数据中的var d)
{
Add(((IDictionary)d).Values.ToArray());
}
返回dt;
}

您可以使用此代码。林克会帮助你:)

var contacts=newlist();
contacts.Add(新的expandooobject());
联系人[0]。Name=“Patrick Hines”;
联系人[0]。电话=“206-555-0144”;
contacts.Add(新的expandooobject());
联系人[1]。姓名=“艾伦·亚当斯”;
联系人[1]。电话=“206-555-0155”;
//数据表实例。。。
DataTable=新的DataTable();
//获取合同列表项的所有属性
var properties=contacts.GetType().GetProperties();
//删除合同列表属性
properties=properties.ToList().GetRange(0,properties.Count()-1.ToArray();
//添加按属性名称命名的列
properties.ToList().ForEach(p=>table.Columns.Add(p.Name,typeof(string));
//从合同列表中添加行
contacts.ForEach(x=>table.Rows.Add(x.Name,x.Phone));

ExpandoObject
实现了
IDictionary
,因此您可以使用任何代码将字典转换为
DataTable
。只要您的对象都具有相同的属性(否则,判断表结构就有点困难)。但是如果他们这样做了,为什么首先要使用
ExpandoObject
?您可以只声明一个类来保存数据,这对可维护性也有积极的影响
class Contact{public string Name{get;set;}public string Phone{get;set;}}
没有那么多需要键入的内容。也许我可以从您那里得到一些帮助,以更好地构造我的代码。我正在处理一个复杂模型列表,它是列表中的一个列表。我之所以在模型中有一个子列表,是因为选择是一个multiselect,它返回一个id列表。我需要将它展平到一个datatable,然后将其批量复制到db。因此,使用新属性创建此模型的动态对象,以保存一个concat ID字符串。ID的concat字符串最终以1,2,3的形式存储在db中的列/字段中。我愿意接受将嵌套列表扁平化为数据表的建议。这听起来像是一个非常特殊的场景,需要比我们在评论中所能做的更多一些。试试看。@Jeroenmoster谢谢。和LINQ一起干得不错。我选择了另一个选项,因为我希望将来重用该方法。您的方法工作得很好,但如果需要转换其他内容,我不想重新键入它。(即,指定财产名称x.名称,x.电话。)感谢您花时间研究此问题。
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));