dynamic

dynamic (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp4_dynamic.html
概要、動的型付け変数、dynamicの仕組み、dynamicで何が出来るのか、遅延バインド、DLR連携、ダックタイピング、
静的メソッドのジェネリックな呼び出し、データアクセス


.NET Framework4.0ではDynamic Language Runtime(DLR)が追加され、スクリプト言語を.NET上で動かせるようになった。
それに伴って導入されたのが、動的型付け変数。

dynamic dx = 1; // dx の型は dynamic 型

実行時の動的なコード生成の仕組み(.NET Framework4.0で追加されたCallSiteというクラス)によって実現されてる。


dynamicで出来ること

* 遅延バインド(late binding): DLL や COM 内のクラス・関数を(必要になったときに、必要な分だけ)実行時に読み込む。
* ダックタイピング(duck typing): (インターフェース等を実装している必要はなく、)同じ名前のメンバーを持っている型ならすべて同列に扱う。
* 多重ディスパッチ(multiple dispatch): 複数のインスタンスの動的な型情報に基づいて、実際に呼び出すメソッドを切り替える (仮想メソッド の複数インスタンス版)。


DLLを利用するには、/rオプションをつけてコンパイルしてアセンブリの参照をするのが通常だが、
そうすると、プログラムの本体実行時にDLLがロードされる。これをアーリーバインド(early binding)という。


それに対し、遅延バインドでは、必要になるまでDLLをロードしない。
C#3.0以前ではリフレクションにより実現できたが、少し面倒だった。
C#4.0ではdynamicを使うだけで実現できるようになった。
ちなみに、コンパイル時の参照指定は必要なく、プログラム本体と同じディレクトリにdllを置くだけでいい。


遅延バインドは動的言語(IronPython などの、DLR 上に実装されたスクリプト言語)との連携や、COM相互運用で威力発揮する。


MS、スクリプト言語.NET Framework対応を拡大 − @IT
http://www.atmarkit.co.jp/news/200710/24/dotnet.html

 DLRは、PythonJavaScriptVisual BasicRubyPerlPHPなどの言語を、.NET Frameworkで実行できるようにするための一般的なフレームワークとして設計された。DLRで走る最初の言語は、ハグニン氏が開発した マイクロソフト独自のIronPythonだ。


objectを引数にとる関数を考える。いろんなobjectに対応するためには、ダックタイピング(柔軟な型判定)が便利。


ジェネリクスはインターフェースによってメソッド、プロパティの呼び出しを行うので、静的メソッドとくに演算子を扱えない難点がある。
dynamicを工夫して使うと、一応静的メソッドが扱えるようになる。

T Sum T (IEnumerable<T> list)
{
    dynamic sum = default(T);
    foreach(var x in list)
    sum += x; // ジェネリック型に対して + は使えないけど、1回 dynamic 型に代入すればできる。
    return (T)sum;
}


データアクセス
C#XML, JSONなどスキーマが決まってないデータへのアクセスが苦手だが、
dynamicを使うと、doc.point.XみたいにしてXMLの要素にアクセスできる。



dynamic の内部実装 (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp4_callsite.html
高度なので飛ばす