DLR-Dynamic型がC#4.0/VB10 から導入されました。IronPythonやIronRuby との連携が話題になっていて,動的言語連携向けだと思って、あまり調べてませんでした。
それだけではないのですね。既存の資産との相性もよさそうです。
動的メンバ-/メソッドの追加・更新も、トリッキーさがなく実装できるので、スクリプト言語並みに使いやすそうです。
リフレクション経由でメソッドを操作することが多いのですが、それが簡略できます。それだけでも Dynamic型の恩恵は大です。
いままでは、
var bf = BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod;
var inst = Activator.CreateInstance(型);
inst.GetType().InvokeMember("メソッド", bf, null, instance, new[] { 引数,,, });
のように記述していましたが、
dynamic inst= Activator.CreateInstance(型);
inst.メソッド();
これでOK。普通のメソッドCallの感覚です。
C#だとインスタンス.xxx の Dot以後の部分は、インテリセンスが働き、アーリーバインドされます。VBでStrict ONだと同様です。
でも、Dynamic型の場合は、存在チェックが動作せず、遅延バインドになります。
この区別はよくできています。
ところが、VBで Dynamic型を使うには、 Option Strict をOffにする必要があります。これが不満。
Linqで使う動的クラスなどでも Strict offにする局面がありました。
厳密な型定義は、潜在バグ回避に有効な手段なので、Strict ONを徹底させています。旧VBの Strict off文化が薄らいできたのに、Off文化が復活するのは嫌。
C#並みにDynamic型のみ遅延バイディング対象にし、Dynamic型以外は、事前バインド必須にすることができなかったのだろうか。
C#ができているのだから方策はあったと思うのだが。
0 件のコメント:
コメントを投稿