c# - 从类(不是实例列表)创建数据表

时间:2011-06-09 10:20:43

标签: c# generics reflection types system.data.datatable

这个问题涉及泛型和类型以及数据表。

下面的代码片段就是网络,并根据泛型类型创建数据表:

public static DataTable ListToDataTable<T>(List<T> list)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in typeof(T).GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }
    foreach (T t in list)
    {
        DataRow row = dt.NewRow();
        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            row[info.Name] = info.GetValue(t, null);
        }
        dt.Rows.Add(row);
    }
    return dt;
}

我正在使用优秀的FileHelpers库将批量记录导入SQL Server。要使用SqlBulkCopy,我需要一个包含给定类型列的数据表。 Filehelpers可以在运行时读取.cs文件并基于此创建您的类型。例如:

System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");

我想改变上面的方法,所以它只是在传递类型时为我创建列(例如'userType')。即方法签名类似于:

public static DataTable TypeToDataTable<T>(<T> myType)

并返回一个包含列的空数据集,准备添加userType行。

我尝试了各种方法 - 任何想法?

2 个答案:

答案 0 :(得分:10)

实际上很简单,当你意识到在这种情况下你不需要(甚至可以)使用泛型时:

public static DataTable CreateEmptyDataTable(Type myType)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }

    return dt;
}

你会这样称呼:

System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");
DataTable emptyDataTable = CreateEmptyDataTable(userType);

答案 1 :(得分:2)

最近我需要这个并在SO上找到它。我将问题中的前提与答案结合起来,并决定分享代码,因为两者都不完整:

private DataTable CreateDataTableFromObjects<T>(List<T> items, string name = null)
{
    var myType = typeof(T);
    if (name == null)
    {
        name = myType.Name;
    }
    DataTable dt = new DataTable(name);
    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }
    foreach (var item in items)
    {
        DataRow dr = dt.NewRow();
        foreach (PropertyInfo info in myType.GetProperties())
        {
            dr[info.Name] = info.GetValue(item);
        }
        dt.Rows.Add(dr);
    }
    return dt;
}