【问题标题】:c# - create a datatable from a class (not a list of instances)c# - 从类创建数据表(不是实例列表)
【发布时间】:2011-09-11 14:07:43
【问题描述】:

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

下面的 sn-p 到处都是网络,并基于泛型类型创建数据表:

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 行。

我尝试了各种方法 - 有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,太好了!出于某种愚蠢的原因,我试图在参数中添加一个 ,而您的方法正是补救措施。
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2017-12-18
      • 2014-04-21
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 2020-06-28
      • 2012-02-26
      • 2017-05-31
      相关资源
      最近更新 更多