[C# ExpandoObject] 動的にプロパティを設定する

[C# 入門] 動的型付け変数(dynamic型)についてでは動的な型について書きましたが、動的にオブジェクトのプロパティを設定したいというときに使えるExpandoObjectクラスを紹介します。
このクラスを使うと事前に定義することなくプロパティを追加することができます。

似たようなクラスでDynamicObjectクラスがありますが、こちらは外部からプロパティが取得・設定されたときに呼び出されるメソッドをオーバーライドして使います。プロパティ名によって処理を切り替えたい場合などはこちらを使うと便利です。

スポンサーリンク

動的にプロパティを設定・取得する

ExpandoObjectクラスの使い方はこんな感じです(using System.Dynamicが必要)。
dynamic型の変数にインスタンスを入れて使います。

using System;
using System.Collections.Generic;
using System.Dynamic;

// メインプログラム
class Program
{
    public static void Main()
    {
        // ExpandoObjectのインスタンスを作成
        dynamic eo = new ExpandoObject();

        // 動的にプロパティを設定
        eo.Prop1 = 10;
        eo.Prop2 = true;
        eo.Prop3 = "abc";

        // プロパティ表示
        Console.WriteLine($"Prop1 = {eo.Prop1}");
        Console.WriteLine($"Prop2 = {eo.Prop2}");
        Console.WriteLine($"Prop3 = {eo.Prop3}");
    }
}
Prop1 = 10
Prop2 = True
Prop3 = abc
Prop4 = 1.25

ExpandoObjectはDictioanryに変換することが可能で、変換したDictionaryにKeyを追加することでプロパティを設定することができます。

using System;
using System.Collections.Generic;
using System.Dynamic;

// メインプログラム
class Program
{
    public static void Main()
    {
        // ExpandoObjectのインスタンスを作成
        dynamic eo = new ExpandoObject();

        // 動的にプロパティを設定
        eo.Prop1 = 10;
        eo.Prop2 = true;

        // Dictionary型に変換してプロパティを設定することもできる
        var dic = (IDictionary<string, dynamic>)eo;
        dic["Prop3"] = "abc";
        dic["Prop4"] = 1.25;

        // プロパティ表示(プロパティ名がコードを書く時にわかってるときはこっち)
        Console.WriteLine($"Prop1 = {eo.Prop1}");
        Console.WriteLine($"Prop2 = {eo.Prop2}");
        Console.WriteLine($"Prop3 = {eo.Prop3}");
        Console.WriteLine($"Prop4 = {eo.Prop4}");

        // Dictioanryに変換して表示
        // この方法だとプログラム実行時までプロパティ名が分からなくても大丈夫
        foreach (var kv in dic)
        {
            Console.WriteLine($"Name={kv.Key}, Value={kv.Value}");
        }
    }
}
Prop1 = 10
Prop2 = True
Prop3 = abc
Prop4 = 1.25
Name=Prop1, Value=10
Name=Prop2, Value=True
Name=Prop3, Value=abc
Name=Prop4, Value=1.25

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました