1

次のようなオブジェクトのリストがあります。

List<UserTransactionDTO>

そして、このリストを に変換したいと思いDatatableます。

次のリンクを検索して見つけました。

ジェネリック List/Enumerable を DataTable に変換しますか?

それは私にとってはHyperDescriptorうまくいきますが、高速化するために実装する方法がわかりません。使用するdllはありますか?


前のリンクで次のコードを使用するだけで、正常に動作します。

public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for(int i = 0 ; i < props.Count ; i++)
    {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;        
}
4

1 に答える 1

3

とても簡単です。プロジェクトでHyperDescriptorライブラリを参照し、アプリケーションの初期化でこれをタイプごとに1回呼び出して、各タイプの記述子を「ハイパー」にします。

Hyper.ComponentModel.HyperTypeDescriptionProvider.Add(typeof(MyType))

HyperTypeDescriptionProviderまたは、プロジェクトのコメントで提供したバージョンのHyperDescriptor(CodeProject)を使用することもできます。タイプとそのベースタイプをに追加しようとしたときのスタックオーバーフローの問題など、私が見つけたいくつかの問題を修正しますHyperTypeDescriptionProvider。そうすればAdd()、関数で呼び出しを行うだけで、同じタイプの2番目の呼び出しでタイプが2回追加されないため、悪いことが起こりません。関数の上部に、ToDataTable<T>()次の行を追加します。

Hyper.ComponentModel.HyperTypeDescriptionProvider.Add(typeof(T))

どちらの方法でも、パフォーマンスのメリットが得られることを確認するために、前後にベンチマークテストを実行することを忘れないでください。

PS HyperDescriptorに関する彼の仕事について、MarcGravellに感謝します。

于 2013-03-06T15:03:55.290 に答える