動的で厄介な反射はもうありませんか?
-
03-07-2019 - |
質問
C#4.0には、実行時に検索される dynamic
キーワードが導入されています。
これは、厄介な反射がもう必要ないということですか?もしそうなら、その例を見せてもらえますか?
解決
リフレクションは引き続き使用できます-通常のCLRオブジェクトに対して「ダイナミック」を使用すると、リフレクションベースのディスパッチャが呼び出されます。
だから、まだ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サポートはありませんが、前者の場合は後者よりもはるかに表現力があります。
他のヒント
動的ディスパッチは、Reflectionの使用法の1つにすぎません。クラスの構造を調べ、その構造に関する情報を取得し、何らかの形で視覚化するか、メンバーに動的にアクセスすることなく何らかの方法でそれに作用する多くの正当な理由があります。リフレクションはここにあります。 :)
動的キーワードの例が必要な場合は、こちらがPDCの動画です男自身(およびその他のC#4.0について)関連)。
Dynamicは、名前でのみ知られているメソッドの問題を解決するのに大いに役立ちます。名前はコンパイル時に既知であり、修正されます。 p>
dynamic
がまったく役に立たない場合があります:
- コンパイル時にメソッド名がわからない(つまり、config /ユーザー入力からロードされる)
- オブジェクトの作成
- いくつかのジェネリックシナリオ
dynamic
の最大の用途は次のとおりです。
- COM相互運用(明らかに)
- 汎用演算子のサポート
- 共通のインターフェースがない場所でのダックタイピング
- DLR相互運用(コメントを参照)
ただし、すべてのリフレクションの問題を解決できるわけではありません。
所属していません StackOverflow