あなたが言及しているMSDNの記事を書いたので、これに答える必要があると思います。
最初に、私はこの質問を予想していたので、ExpandoObject:Dynamic in C#4.0:Introducing the ExpandoObjectの多かれ少なかれ実際の使用例を示すブログ投稿を書きました。
まもなく、ExpandoObjectは、複雑な階層オブジェクトを作成するのに役立ちます。たとえば、辞書内に辞書があるとします。
Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);
より深いのは階層であり、醜いのはコードです。ExpandoObjectを使用すると、エレガントで読みやすくなります。
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
次に、すでに指摘したように、ExpandoObjectはINotifyPropertyChangedインターフェイスを実装しており、ディクショナリよりもプロパティを詳細に制御できます。
最後に、次のようにExpandoObjectにイベントを追加できます。
class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
// Initialize the event to null (meaning no handlers)
d.MyEvent = null;
// Add some handlers
d.MyEvent += new EventHandler(OnMyEvent);
d.MyEvent += new EventHandler(OnMyEvent2);
// Fire the event
EventHandler e = d.MyEvent;
e?.Invoke(d, new EventArgs());
}
static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent fired by: {0}", sender);
}
static void OnMyEvent2(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
}
}
また、動的にイベント引数を受け入れることを妨げるものは何もないことに注意してください。つまり、を使用する代わりにEventHandler
、を使用EventHandler<dynamic>
すると、ハンドラの2番目の引数がになりますdynamic
。