2

DynamicObjectsExpandoObjects( ExpandoObject 、 DynamicObject 、および dynamic の違い) は最初は非常に便利に聞こえますが、実際に使用したことはありません。遅延バインディングは、実行時にエラーをスローする可能性があるため、非常に安全でない/不安定なように感じますが、そうでなければ回避できたはずです。一般に、MSDN は事前バインディングのいくつかの利点を指摘し、可能であれば遅延バインディングを使用しないことを提案しています ( https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx )。

遅延バインディングなしでは解決できない状況に陥ったことはなく、「悪いスタイル」と見なされているように見えるため、実際に遅延バインディングの使用が必要な状況があるかどうかを知りたい. 遅延バインディング (特に DynamicObject または ExpandoObject) を使用した例はありますか?「コーディングしやすい」という理由以外に、この設計を選択した正当な理由はありますか?

4

1 に答える 1

2

ほとんどの場合dynamic、タイプ セーフなプログラミング スタイルを使用することは避けて、それに従うことをお勧めします。

しかし、 を使用することで生活dynamic向上する場合や、それなしでは不可能な非常に優れたことが可能になる場合もありますdynamic

ExpandoObject

次の例を考えてみましょう ( を使用せずにExpandoObject):

Dictionary<String, object> info = new Dictionary<string, object>();
Dictionary<String, object> person = new Dictionary<string,object>();
info["Person"] = person;
person["Name"] = "John";
person["Surname"] = "Smith";

現在使用中ExpandoObject

dynamic info = new ExpandoObject();
info.Person = new ExpandoObject();
info.Person.Name = "John";
info.Person.Surname = "Smith";

これは良くないですか?オブジェクトの大きな階層を操作するためにExpandoObjectある種のプロパティ バッグが必要なときはいつでも、辞書の代わりに使用できます。しかし、普通の小さな辞書を持っている場合は、おそらく辞書に固執する方がよいでしょう。そのほうが明確であり、パフォーマンスのオーバーヘッドもありません。

動的オブジェクト

ここで、オブジェクトの巨大な階層があるとします (たとえば、JSON に由来する)。DynamicObjectJSON を動的オブジェクトに簡単にデシリアライズするためのカスタムを作成できます。こちらの例を参照してください。DynamicObject!を介して、さらに多くのクールなことを行うことができます。


さらに、DLR (および C# での動的サポート) により、たとえば、C# コンテキストから動的言語 (IronRuby など) を実行できます。

ご覧のとおり、C# での動的サポートは非​​常に強力な概念ですが、適切な場合にのみ使用する必要があります。

于 2015-02-10T09:11:09.150 に答える