ExpandoObjectの本当のメリットは何ですか? 質問する

ExpandoObjectの本当のメリットは何ですか? 質問する

展開オブジェクト.NET 4 に追加されるクラスを使用すると、実行時にオブジェクトに任意のプロパティを設定できます。

これに、Dictionary<string, object>、あるいは実際にはハッシュ表? 私の知る限り、これは、もう少し簡潔な構文でアクセスできるハッシュ テーブルに他なりません。

たとえば、これはなぜでしょうか:

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

以下よりも本当に優れている、または大幅に異なるもの:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

実行時に決定される型を使用していることが明白にならないこと以外に、任意の辞書型を使用する代わりに ExpandoObject を使用することによって得られる実際の利点は何でしょうか。

ベストアンサー1

あなたが言及している MSDN の記事を私が書いたので、この質問に答える必要があると思います。

まず、私はこの質問を予想していたので、ExpandoObject の実際の使用例をほぼ示すブログ記事を書きました。C# 4.0 の動的機能: 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);

2 番目に、すでに指摘したように、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

おすすめ記事