私はASP.NETを初めて使用します。私はVB6/ASP(クラシック)/ SQLServer2000のバックグラウンドを持っています。私はVisualStudio2008についてたくさん読んでいます(インストールしていて、いじっています)。私は「リフレクション」について読んだので、誰かに、上記で書いたテクノロジーの年配の開発者に、リフレクションとは何か、なぜそれを使用するのかをできるだけ詳しく説明してもらいたい...その周りの私の頭。ありがとう!
6 に答える
リフレクションは、通常はアクセスできない(つまり、プライベート、保護などのメンバー)ことなく、さまざまなタイプの内部を探索する方法です。
また、DLLを動的にロードし、プロジェクトに静的にコンパイルすることなく、DLLで定義されているタイプとメソッドにアクセスするためにも使用されます。
一言で言えば、Reflectionは、コードの内部を覗くためのツールキットです。
なぜそれを使用するのかというと、それは一般的に複雑な状況、またはコード分析でのみ使用されます。他の一般的な使用法は、プリコンパイルされたプラグインをプロジェクトにロードすることです。
リフレクションを使用すると、プログラムでアセンブリをロードしたり、アセンブリ内のすべてのタイプのリストを取得したり、これらのタイプのすべてのプロパティとメソッドのリストを取得したりできます。
例として:
myobject.GetType().GetProperty("MyProperty").SetValue(myobject, "wicked!", null)
これにより、オブジェクトの内部を外の世界(上記のオブジェクトを使用しているコード)に反映させることができます。
C#(およびJava)のような静的に型付けされた言語での実際の使用法は、実行時に文字列(たとえば、メソッドの名前-コンパイル時に使用するメソッドの名前がわからない場合)を介してメソッド/メンバーを呼び出せるようにすることです。時間)。
動的言語のコンテキストでは、この用語をあまり聞いたことがありません(通常、上記について心配する必要はありません)。それ以外の場合は、メソッド/メンバーなどのリストを繰り返し処理します...
リフレクションは、実行時にアセンブリ、クラス、またはメソッドの情報を操作または抽出する.Netの手段です。たとえば、メソッドを含め、実行時にクラスを作成できます。一酸化炭素で述べられているように、リフレクションはアセンブリをプラグインとして動的にロードするために使用されます。または、事前に、IronPythonのように.Netをターゲットとする.Netコンパイラを作成するために使用されます。
更新:詳細については、メタプログラミングのトピックとそれに関連するトピックを参照してください。
.NET(ASP.NET、Windowsフォーム、コマンドライン、クラスライブラリなど)でアセンブリをビルドすると、アセンブリ内に多数のメタデータ「定義テーブル」も作成され、に対応するメソッド、フィールド、およびタイプに関する情報が格納されます。コードに記述したタイプ、フィールド、およびメソッド。
.NETのSystem.Reflection名前空間のクラスを使用すると、これらのテーブルを列挙して相互作用し、これらのテーブルのアイテムをクエリしてアクセスするための「オブジェクトモデル」を提供できます。
Reflectionの一般的な使用法の1つは、アプリケーションに拡張性(プラグイン)を提供することです。たとえば、Reflectionを使用すると、ファイルパスからアセンブリを動的にロードし、そのタイプで特定の有用なタイプ(アプリケーションが呼び出すことができるインターフェイスなど)を照会してから、この外部アセンブリで実際にメソッドを呼び出すことができます。
カスタム属性もリフレクションと密接に関連しています。たとえば、NUnit単体テストフレームワークでは、[Test] {TestFixture]属性を独自のコードに追加することで、テストクラスとテストメソッドを指定できます。
ただし、NUnitテストランナーはReflectionを使用してアセンブリをロードし、test属性を持つメソッドのすべてのオカレンスを検索してから、実際にテストを呼び出す必要があります。
これは非常に単純化されていますが、Reflectionが不可欠な場所の良い実用的な例を提供します。
リフレクションは確かに強力ですが、オブジェクト指向プログラミングのアクセス修飾子(カプセル化)の基本的な概念を完全に無視できることに注意してください。
たとえば、これを使用して、クラス内のプライベートメソッドのリストを取得し、実際に呼び出すことができます。このため、カプセル化をバイパスしたり、(不良)コードを非常に緊密に結合したりしないように、どのように、どこで使用するかを慎重に検討する必要があります。