6

この質問は、ジェネリックスとタイプ、およびデータテーブルに関するものです。

次のスニペットはネットのあちこちにあり、ジェネリック型に基づいてデータテーブルを作成します。

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ライブラリを使用して、レコードのバッチをSQLServerにインポートしています。SqlBulkCopyを使用するには、特定のタイプの列を含むデータテーブルが必要です。Filehelpersは、実行時に.csファイルを読み込み、それに基づいてタイプを作成できます。例えば:

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

上記のメソッドを変更して、タイプ(たとえば、「userType」)が渡されたときに列が作成されるようにします。つまり、メソッドのシグネチャは次のようになります。

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

そして、userTypeの行を追加する準備ができた、列を含む空のデータセットを返します。

私はさまざまな方法を試しました-何かアイデアはありますか?

4

2 に答える 2

13

この場合、ジェネリックを使用する必要がない(または使用できない)ことに気付いたとき、それは実際には非常に単純です。

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);
于 2011-06-09T10:26:32.220 に答える