C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/12/20 20:06
これから何回かに分けて、リフレクションの基本について一通り解説して行こうかと思います。

【 リフレクションとは何か? 】
一言で言うと、メタデータ ( データについてのデータ ) を扱う仕組みです。

アセンブリ,モジュール,型 ( クラス,構造体,インターフェイス,デリゲート,列挙型 ) ,メンバ (  フィールド,プロパティ,イベント,コンストラクタ,メソッド ) の情報を、動的に取得・使用・生成することができます。
要するに、プログラムコードでプログラムコードを扱うというようなイメージです。
まだイマイチわかりづらいと思いますので、例を挙げて説明していきます。

例えば、 パブリックなメソッド " Method1 " と、プライベートなメソッド " Method2 " を持つ、" Class1 " というクラスがあります。
このクラスに対してリフレクションを利用すると、
「Class1クラスのMethod1メソッドのパラメータリストを、動的に調べる」とか、
「Class1クラスのプライベートメソッドであるMethod2メソッドを、外部から呼び出す」とか、
「Class1クラスに、新しく " Method3 " というメソッドを、動的に追加する」
といったことが可能になります。もちろん、これらは一例であり、他にもいろいろなことができます。

また、アセンブリに埋め込まれたリソースの取得や、アセンブリの動的ロード、属性の取得などにも、リフレクションを利用します。


【 リフレクションを使う場面 】
「リフレクションなんて必要あるの?」と思う人もいるかもしれませんが、例えば以下に挙げるようなアプリケーションやクラスライブラリでは、しばしばリフレクションを必要とします。

・.NET 開発のサポート系アプリケーション
代表例 : Visual Studio、Reflector、NDoc、FxCop、etc...

・.NET 開発のサポート系クラスライブラリ
代表例 : Enterprise Library、etc...

・他者が機能を拡張するための機構 ( プラグイン ) を設けるアプリケーション
代表例 : Visual Studio 2005、etc...

どれも、リフレクションを使用している機能を利用するのは.NET開発者です。 ( " プラグイン機能を利用するのはプラグイン開発者 " として。 )
他に、IronPytonやPowerShellも、リフレクションを利用しています。これらは、コンソールに入力されたコード ( コマンド ) を、リフレクションを利用して処理しています。


【 名前空間 】
リフレクションの主要なクラスは、以下の2つの名前空間に含まれています。

System.Reflection 名前空間
メタデータを動的に取得・使用するためのクラス群が含まれています。

System.Reflection.Emit 名前空間
メタデータを動的に生成するためのクラス群が含まれています。

なお、System.Reflection 名前空間には含まれてはいませんが、Type クラス (System) や、AppDomain クラス (System) も、リフレクションにおける重要なクラスの一つです。



今回はここまでです。次回は、リフレクションを利用してメタデータを取得する方法について解説します。
タグ: .NET C# Reflection











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/67-a01b0dcf