[C# 入門] 動的型付け変数(dynamic型)についてでは動的な型について書きましたが、動的にオブジェクトのプロパティを設定したいというときに使えるExpandoObjectクラスを紹介します。
このクラスを使うと事前に定義することなくプロパティを追加することができます。
似たようなクラスでDynamicObjectクラスがありますが、こちらは外部からプロパティが取得・設定されたときに呼び出されるメソッドをオーバーライドして使います。プロパティ名によって処理を切り替えたい場合などはこちらを使うと便利です。
[C# DynamicObject] 動的にプロパティを設定する
動的型付け変数(dynamic型)についてでは動的な型について書きましたが、動的にオブジェクトのメンバー(プロパティ)を設定したいというときに使えるDynamicObjectクラスを紹介します。 DynamicObjectクラスは名前空間S...
動的にプロパティを設定・取得する
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# 記事まとめページに戻る(他のサンプルコードもこちら)
C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。
コメント