2009-05-03 18 views

答えて

6

私たちはまだReflectionを持っています - 通常のCLRオブジェクトに対して 'dynamic'を使用すると、Reflectionベースのディスパッチャが呼び出されます。

だから、私たちはまだリフレクションを持っていますが、やりやすくなります。ここで

は例です:

// Via 'dynamic'  
dynamic dx = GetSomeCLRObject(); 
dx.DoSomething(); 
dx.SomeMember = 2; 

// Via Reflection 
object x = GetSomeCLRObject(); 
Type xt = x.GetType(); 
MemberInfo DoSomethingMethod = xt.GetMethod("DoSomething"); 
DoSomethingMethod.Invoke(x, null); 
PropertyInfo SomeMemberProperty = xt.GetProperty("SomeMember"); 
SomeMemberProperty.SetValue(x, 2); 

私はあなたのことは知らないが、私はかつてのが好きです。 =)

これらの両方のケースでは、コンパイル時のチェックもなく、IntellisenseもIDEサポートもありませんが、前者の方が後者よりはるかに表現力があります。

+0

すごくうまいですが、私はダイナミックな言語機能について多くのことを聞いてきましたが、どのように動作するのか全く分かりませんでした。私はクラスライブラリのもののために頻繁にリフレクションを使用するので、これは素晴らしいです。私は実際に反射をカプセル化するオブジェクトのためのいくつかの拡張メソッドを書いた....それらは冗長になります:-( – andy

+0

同じ構文がDLR上で動作するもの(PythonやJavascriptのようなもの、さらにはCOMオブジェクト)をターゲットにできることがわかった方が良いと思います。 =) –

4

ダイナミックディスパッチは、リフレクションの1つの使用のみです。構造体のクラスを調べ、その構造体に関する情報を取得し、何らかの形で視覚化したり、何らかの方法で動的にメンバーにアクセスしたりすることなく、それを実行する理由はたくさんあります。反射はここにあります。 :)

here is a video from PDCthe man himselfについては、それと(その他のC#4.0関連の)動的キーワードの例が必要な場合。

+0

偉大な話 - 特にC#5のもの - 私にうずまきがあります... –

+0

ええ、REPLとC#はとても素晴らしかったです。 –

1

ダイナミックは、コンパイル時にその名前がわかっていて固定されている、名前だけで知られているメソッドの問題を解決するのに大いに役立ちますが、もちろんそのようなメソッドはタイプを制御するとインタフェースとして表現できます。

dynamicは全く役に立たない場合もあります

メソッド名は、コンパイル時に知られていない
  • (すなわち、それは、設定/ユーザー入力から読み込まれる)
  • オブジェクトの作成
  • は、
  • は、おそらくいくつかのジェネリック医薬品のシナリオは、私がdynamicを参照

最大の用途は以下のとおりです。

  • COM相互運用機能(明らかに)
  • 一般的なオペレータサポートそこには共通のインタフェースはDLRの相互運用(コメントを参照)

  • ではありません。しかし、それは間違いなくすべての反射を解決しない
  • ダックタイピングうわー。

  • +0

    ジェネリックのシナリオについての良い点。私にとって少なくともジェネリックスは私の反省の大部分が起こる場所です。この場合、ダイナミクスは役に立ちません。 しかし、ジェネリックスはメソッドから返されるanonymos型の発行を解決しますか? – andy

    +0

    * dynamic *は匿名型での作業を容易にしますが、正直言って答えは "名前付き型を作る"でしょう。 Re generics - *いくつかのジェネリックが動作するかもしれません(ベータの前に伝えるのは難しい) - しかし、私はジェネリックのすべてを動作させるとは仮定しません。主に、問題はジェネリックメソッド(ジェネリックタイプではなく、あなたが実体化された後に型が閉じられるのでOKです)です。 –

    +0

    DLR interopをあなたの肯定的なユースケースリストに追加する必要があります。これは、今後のフレームワークにおいてますます重要になるだろうからです。 @エリック - 確かに; –

    関連する問題