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パターンある。
-
IDictionary
に追加する(形式は
〈オブジェクト名〉[〈プロパティ名〉] = 〈設定値〉;
)expandoDict["Foo"] = "New Property"; expandoDict["Bar"] = int.MaxValue;
-
ExpandoObject
オブジェクトに追加する(形式は
〈オブジェクト名〉.〈プロパティ名〉 = 〈設定値〉;
)expando.Baz = DateTime.Now;
いずれのやり方でも同じ結果になる。
プロパティ名を文字列として扱う必要がないなら、後者(ExpandoObject
オブジェクトに対して追加)の方法でいいんじゃないかと思う。
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。
この記事にコメントをしてみませんか?