问题描述
给定一个对象列表,我需要将其转换为一个数据集,其中列表中的每个项目都由一行表示,每个属性都是行中的一列。然后,该DataSet将被传递给功能,以便创建一个Excel文档作为一个报告。
Given a list of objects, I am needing to transform it into a dataset where each item in the list is represented by a row and each property is a column in the row. This DataSet will then be passed to an Aspose.Cells function in order to create an Excel document as a report.
说我有以下:
public class Record
{
public int ID { get; set; }
public bool Status { get; set; }
public string Message { get; set; }
}
给定列表记录,如何将其转换为DataSet如下:
Given a List records, how do I transform it into a DataSet as follows:
ID Status Message
1 true "message"
2 false "message2"
3 true "message3"
...
目前我唯一可以想到的的如下:
At the moment the only thing I can think of is as follows:
DataSet ds = new DataSet
ds.Tables.Add();
ds.Tables[0].Add("ID", typeof(int));
ds.Tables[0].Add("Status", typeof(bool));
ds.Tables[0].Add("Message", typeof(string));
foreach(Record record in records)
{
ds.Tables[0].Rows.Add(record.ID, record.Status, record.Message);
}
但是,这样让我觉得必须有一个更好的方法,因为在至少如果将新的属性添加到Record,那么它们将不会显示在DataSet中,但同时它允许我控制每个属性添加到该行的顺序。
But this way leaves me thinking there must be a better way since at the very least if new properties are added to Record then they won't show up in the DataSet...but at the same time it allows me to control the order each property is added to the row.
有没有人知道一个更好的方法来做到这一点?
Does anyone know of a better way to do this?
推荐答案
你可以通过反思和泛型,检查底层类型的属性。
You can do it through reflection and generics, inspecting the properties of the underlying type.
考虑我使用的扩展方法:
Consider this extension method that I use:
public static DataTable ToDataTable<T>(this IEnumerable<T> collection)
{
DataTable dt = new DataTable("DataTable");
Type t = typeof(T);
PropertyInfo[] pia = t.GetProperties();
//Inspect the properties and create the columns in the DataTable
foreach (PropertyInfo pi in pia)
{
Type ColumnType = pi.PropertyType;
if ((ColumnType.IsGenericType))
{
ColumnType = ColumnType.GetGenericArguments()[0];
}
dt.Columns.Add(pi.Name, ColumnType);
}
//Populate the data table
foreach (T item in collection)
{
DataRow dr = dt.NewRow();
dr.BeginEdit();
foreach (PropertyInfo pi in pia)
{
if (pi.GetValue(item, null) != null)
{
dr[pi.Name] = pi.GetValue(item, null);
}
}
dr.EndEdit();
dt.Rows.Add(dr);
}
return dt;
}
这篇关于如何转换列表< T>进入DataSet?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!