1. ホーム
  2. c#

[解決済み] .NET - Generic CollectionをDataTableに変換する。

2023-07-22 22:30:26

質問

私は、一般的なコレクション(リスト)をDataTableに変換しようとしています。私はこれを行うのに役立つ次のコードを見つけました。

// Sorry about indentation
public class CollectionHelper
{
private CollectionHelper()
{
}

// this is the method I have been using
public static DataTable ConvertTo<T>(IList<T> list)
{
    DataTable table = CreateTable<T>();
    Type entityType = typeof(T);
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

    foreach (T item in list)
    {
        DataRow row = table.NewRow();

        foreach (PropertyDescriptor prop in properties)
        {
            row[prop.Name] = prop.GetValue(item);
        }

        table.Rows.Add(row);
    }

    return table;
}    

public static DataTable CreateTable<T>()
{
    Type entityType = typeof(T);
    DataTable table = new DataTable(entityType.Name);
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

    foreach (PropertyDescriptor prop in properties)
    {
        // HERE IS WHERE THE ERROR IS THROWN FOR NULLABLE TYPES
        table.Columns.Add(prop.Name, prop.PropertyType);
    }

    return table;
}
}

私の問題は、MySimpleClassのプロパティの1つをnullable型に変更すると、次のエラーが発生することです。

DataSet does not support System.Nullable<>.

クラス内のNullableプロパティ/フィールドでこれを行うにはどうしたらよいですか?

どのように解決するのですか?

次に、おそらくは、それらを非ヌル可能なフォームに持ち上げる必要があります。 Nullable.GetUnderlyingType を使用し、おそらくいくつかの null の値を DbNull.Value ...

という割り当てに変更します。

row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;

と、なるようにカラムを追加する場合。

table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(
            prop.PropertyType) ?? prop.PropertyType);

で、動作します。( ?? は null coalescing 演算子で、最初のオペランドが non-null ならばそれを使い、そうでなければ 2 番目のオペランドが評価されて使われます)