アカウント名:
パスワード:
var sample1 = new Sample();sample1.Add();dynamic sample2 = new Sample();sample2.Add();
と書けます。sample1
dynamic dynamic_obj = new Hoge();
dynamic_obj.メソッド名(引数1,...,引数n);
dynamic_obj.GetType() .GetMethod("メソッド名",{引数1.GetType(),...,引数n.GetType()}) .Invoke(引数1,...,引数n);
dynamic_obj.GetType()
.GetMethod("メソッド名",{引数1.GetType(),...,引数n.GetType()})
.Invoke(引数1,...,引数n);
に書き換える恐怖のシンタックスシュガー、って事ですよね多分?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家
自分の理解 (スコア:5, 参考になる)
正確にはそれを支えるために.NET Framework 4.0では動的なメソッド呼び出しをサポートするインターフェースが用意されるとか。
コード中には静的にコンパイルされたものと動的に決定されるものとが混在できる仕様です。
例えばあるSampleクラスがAdd()メソッドを持っていた場合、C# 4.0では
と書けます。sample1
Re:自分の理解 (スコア:2, 興味深い)
Re:自分の理解 (スコア:1)
* IDynamicObject を実装してたら IDynamicObject 経由
* そうじゃなかったらリフレクションから調べる
という分岐を勝手に中でやるそうです。
勝手にやられるのが恐怖っちゃー恐怖ですね。
Re:自分の理解 (スコア:1)
あくまでdynamic宣言した変数に対するメンバー呼び出しのみに制限されるので、それほど怖くないと思います。
Re: (スコア:0)
つまり、C#コンパイラの仕事は、「dynamic_obj.メソッド名(引数1,...,引数n)」をそのまま素直にASTに変換すること。
言語エンジンは渡されたASTと引数の実行時型を使って動的バインディングを行い、実行時コード生成を利用してJIT可能コードに変換、結果はデリゲートに格納、格納されたデリゲートは引数の実行時型をキーとしてキャッシュ、というかなりパフォーマンス重視の本格的な実装だったような気がするけど、うろ覚えなんであんまり自信がない。