メイン画像

C# - オブジェクトに動的にプロパティを追加する

C# - オブジェクトに動的にプロパティを追加する


通常、C# ではオブジェクトへ動的にプロパティを追加できない。

しかし、オブジェクトを ExpandoObject に変換すれば追加できるようになる。

動的にプロパティを追加する方法

次のプログラムは、Employee クラスのオブジェクトを ExpandoObject に変換し、動的にプロパティを追加する。

 

Employee クラスの定義は次のとおり。

internal class Employee
{
    public int Id { get; set; }

    public string Name { get; set; }
}

 

Employee クラスを ExpandoObject に変換してプロパティを追加するコードは次のとおり。

static int Main(string[] args)
{
    var emp1 = new Employee()
    {
        Id = 1,
        Name = "John",
    };

    //
    // EmployeeクラスをExpandoObjectに変換する
    //
    dynamic expando = new ExpandoObject();
    var expandoDict = (System.Collections.Generic.IDictionary<string, object>)expando;

    // ここでEmployeeクラスのプロパティをExpandoObjectにコピーする
    foreach (var prop in emp1.GetType().GetProperties())
    {
        expandoDict[prop.Name] = prop.GetValue(emp1);
    }

    //
    // Employeeクラスにはない独自のプロパティを追加する
    // (IDictionaryに追加してもいいし、ExpandoObjectに追加してもいい)
    //
    expandoDict["Foo"] = "New Property";
    expandoDict["Bar"] = int.MaxValue;
    expando.Baz = DateTime.Now;

    //
    // 結果表示
    //
    Console.WriteLine($"Id: {expando.Id}, Name: {expando.Name}, Foo: {expando.Foo}, Bar: {expando.Bar}, Baz: {expando.Baz.ToString("yyyy/MM/dd HH:mm")}");

    return 0;
}

 

プログラムを実行すると次のように表示される。

Id: 1, Name: John, Foo: New Property, Bar: 2147483647, Baz: 2010/09/20 15:43

説明

ExpandoObject オブジェクトを生成して、IDictionary に変換する。

dynamic expando = new ExpandoObject();
var expandoDict = (System.Collections.Generic.IDictionary<string, object>)expando;

 

Employee クラスのオブジェクトが持つプロパティを ExpandoObject オブジェクトにコピーする。

foreach (var prop in emp1.GetType().GetProperties())
{
    expandoDict[prop.Name] = prop.GetValue(emp1);
}

 

独自のプロパティも追加できる。

やり方は2パターンある。

  1. IDictionary に追加する

    (形式は 〈オブジェクト名〉[〈プロパティ名〉] = 〈設定値〉;

    expandoDict["Foo"] = "New Property";
    expandoDict["Bar"] = int.MaxValue;
  2. ExpandoObject オブジェクトに追加する

    (形式は 〈オブジェクト名〉.〈プロパティ名〉 = 〈設定値〉;

    expando.Baz = DateTime.Now;

いずれのやり方でも同じ結果になる。

プロパティ名を文字列として扱う必要がないなら、後者(ExpandoObject オブジェクトに対して追加)の方法でいいんじゃないかと思う。


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事