簡體   English   中英

c# - 從 class 創建數據表(不是實例列表)

[英]c# - create a datatable from a class (not a list of instances)

這個問題涉及 generics 和類型以及數據表。

以下代碼片段遍布網絡各處,並基於泛型類型創建數據表:

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 服務器。 要使用 SqlBulkCopy,我需要一個包含給定類型列的數據表。 Filehelpers 可以在運行時讀取 a.cs 文件並基於該文件創建您的類型。 例如:

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

我想更改上面的方法,以便在傳遞類型(例如'userType')時為我創建列。 即方法簽名將類似於:

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

並將返回一個帶有列的空數據集,准備好將 userType 行添加到其中。

我嘗試了各種方法 - 有什么想法嗎?

這實際上很簡單,當您意識到在這種情況下您不需要(甚至可以)使用 generics 時:

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

最近我正是需要這個,並在 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM