gpt4 book ai didi

c# - 如何将 List 转换为 DataSet?

转载 作者:可可西里 更新时间:2023-11-01 03:14:27 26 4
gpt4 key购买 nike

给定一个对象列表,我需要将其转换为一个数据集,其中列表中的每个项目都由一行表示,每个属性是该行中的一列。然后这个数据集将被传递给 Aspose.Cells功能,以便将 Excel 文档创建为报告。

假设我有以下内容:

public class Record
{
public int ID { get; set; }
public bool Status { get; set; }
public string Message { get; set; }
}

给定一个 List 记录,我如何将其转换为 DataSet,如下所示:

ID Status Message
1 true "message"
2 false "message2"
3 true "message3"
...

目前我唯一能想到的是:

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 中......但同时它允许我控制每个属性添加到行的顺序。

有谁知道更好的方法吗?

最佳答案

您可以通过反射和泛型检查底层类型的属性来做到这一点。

考虑一下我使用的这个扩展方法:

    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;
}

关于c# - 如何将 List<T> 转换为 DataSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/523153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com