リストをデータテーブルに変換する方法を
サンプルコードを交えて解説したいと思います。
説明
・列の追加
① GetPropertiesメソッドでプロパティを取得
② 取得したプロパティの型を取得
③ プロパティと同じ名前と型の列を追加
・行の追加
① GetPropertiesメソッドでプロパティを取得
② 取得したプロパティの値を取得
③ プロパティの値を行に設定
④ 行を追加
ポイント
・GetUnderlyingTypeメソッドを使うことでNULL 許容型の基になる型を取得できる
・プロパティの値がnullの場合はデータテーブルにはDBNullを設定する
データテーブルをリストに変換したい場合は以下を参考にしてください。
funcording.hatenablog.com
例
コード
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace Sample { /// <summary> /// メインプログラム /// </summary> public class Program { /// <summary> /// リストをデータテーブルに変換 /// </summary> static void Main() { // リストの生成 var personList = new List<Person>() { new Person() { Name = "一郎", Age = 10}, new Person() { Name = "二郎", Age = 20}, new Person() { Name = "三郎", Age = null} }; // テーブルの生成 var table = new DataTable(); // 列の追加 foreach(PropertyInfo property in typeof(Person).GetProperties()) { // 型を取得 var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; // 追加 table.Columns.Add(property.Name, type); } // 行の追加 foreach(var person in personList) { // 行の作成 DataRow row = table.NewRow(); // 値を設定 foreach(PropertyInfo property in typeof(Person).GetProperties()) { var value = property.GetValue(person, null) ?? DBNull.Value; row[property.Name] = value; } // 追加 table.Rows.Add(row); } // 列を出力 Console.WriteLine("列"); foreach(DataColumn dataColumn in table.Columns) { Console.WriteLine("列名 : " + dataColumn.ColumnName + "、 型 : " + dataColumn.DataType); } Console.WriteLine(); // 行を出力 Console.WriteLine("行"); foreach(DataRow dataRow in table.Rows) { Console.WriteLine("名前 : " + dataRow[0] + "、 年齢 : " + dataRow[1]); } Console.WriteLine(); } } /// <summary> /// 人間テーブルのエンティティクラス /// </summary> public class Person { /// <summary> /// 名前を取得/設定 /// </summary> public string? Name { get; set; } /// <summary> /// 年齢を取得/設定 /// </summary> public int? Age { get; set; } } }
出力
列 列名 : Name、 型 : System.String 列名 : Age、 型 : System.Int32 行 名前 : 一郎、 年齢 : 10 名前 : 二郎、 年齢 : 20 名前 : 三郎、 年齢 :