読者です 読者をやめる 読者になる 読者になる

たきるブログ

C#やOracleなどの情報を書いています。

【C#】DataRowをエンティティクラスにマッピングする拡張メソッド

DataRowを操作する時に、クラスマッピングして操作できるようにしてしまおう。

型無し DataRow をデータクラスに変換してみた( VB.NET 版)
アンチ型付DataSet派の自作ORマッピング - 山本大の日記

上記URLの内容を参考に、DataRowをエンティティにマッピングする拡張メソッドを書いた。 (ほぼ同じだけど・・・)

DataRowExtensions.cs

public static class DataRowExtensions
{
    public static T ToEntity<T>(this DataRow row) where T : new()
    {
        var resultData = new T();
        var t = resultData.GetType();
        var pis = t.GetProperties();

        foreach (var pi in pis)
        {
            pi.SetValue(resultData, row[pi.Name]);
        }

        return resultData;
    }
}

MemberData.cs

class MemberData
{
    public int ID { get; set; } = 0;
    public string Name { get; set; } = "";
}

Form1.cs

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var dt = new DataTable("SampleTable");
        dt.Columns.AddRange(new DataColumn[] {
            new DataColumn("ID", typeof(int)),
            new DataColumn("Name", typeof(string))
        });

        dt.Rows.Add(new object[] { 1, "aaa" });
        dt.Rows.Add(new object[] { 2, "bbb" });
        dt.Rows.Add(new object[] { 3, "ccc" });

        foreach (DataRow row in dt.Rows)
        {
            var user = row.ToEntity<MemberData>();
            Console.WriteLine("ID = {0}, Name = {1}", user.ID, user.Name);
        }
    }
}