正在寻找,并就如何动态列表转换为databale, C#,请指教开裂我的大脑,感谢转换的动态列表,数据表C#
List<dynamic>dlist=new List<dynamic>
到
DataTable
正在寻找,并就如何动态列表转换为databale, C#,请指教开裂我的大脑,感谢转换的动态列表,数据表C#
List<dynamic>dlist=new List<dynamic>
到
DataTable
以下是可以将任何列表对象转换为数据表的方法..
public DataTable ConvertToDataTable<T>(IList<T> data)
{
PropertyDescriptorCollection properties =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}
不适用于列表
使用此功能,
public static DataTable ConvertToDatatable<T>(this IList<T> data)
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for(int i = 0 ; i < props.Count ; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return table;
}
不适用于列表
我不知道为什么你需要这个,但是,你可以使用这个ObjectShredder
使用反射,可以任何转换为DataTable
,所以即使是动态或匿名类型:
Implement CopyToDataTable<T>
Where the generic Type T
Is Not a DataRow
public DataTable ToDataTable<T>(dynamic items)
{
DataTable dtDataTable = new DataTable();
if (items.Count == 0) return dtDataTable;
((IEnumerable)items[0]).Cast<dynamic>().Select(p => p.Name).ToList().ForEach(col => { dtDataTable.Columns.Add(col); });
((IEnumerable)items).Cast<dynamic>().ToList().
ForEach(data =>
{
DataRow dr = dtDataTable.NewRow();
((IEnumerable)data).Cast<dynamic>().ToList().ForEach(Col => { dr[Col.Name] = Col.Value; });
dtDataTable.Rows.Add(dr);
});
return dtDataTable;
}
这工作对我来说,虽然我不得不交换“名称”的“钥匙”,因为我的枚举包含KeyValuePair –
你的意思是,项目中的每个属性/字段都应该成为数据表中的列?如果'dlist'中的每个项目都是不同类型的呢?最重要的是:你已经尝试过了什么?显示你的努力。 – MarcinJuraszek