2016年6月14日火曜日

[C#] reflection(リフレクション)

こんにちは。明月です。
今日は「reflection(リフレクション)」について勉強します。


reflection(リフレクション)の機能はC#だけにある機能ではなく、C言語の以降のプログラム言語なら全部支援している機能だと思います。
そのほど、プログラミングの中で重要な部分だし、動的なプログラムを実装するところになくてならない部分だと思います。


reflection(リフレクション)


今まで我々はクラスを割り当てるし、変数を宣言するし、メソッドを呼び出すことでプログラムを実装しました。reflectionはそのプログラムの流れを静的で実装する(ソースの中でメソッド名を呼び出す)ことではなく動的に実装する(ソースの中で呼び出すメソッドが決まってない)ための機能です。
すなわち、任意なクラスのメソッドを呼び出すためにはソースの中でメソッド名を実装して使うとおもいますが、reflectionの場合はそのメソッド名によってメソッドオブジェクトを取得してInvokeメソッド(実行)を通って実装することと思います。



上のソースを見ると普通のクラスを割り当ててメソッドを呼び出す方法です。でも次の例はreflectionを利用して静的に実装した部分を動的に実装することです。



上の例はメソッドをreflection(リフレクション)タイプで動的にメソッドを呼び出したソースです。ソースを見るとクラスは「Activator.CreateInstance」のメソッドを通ってクラスをインスタンス化(割り当て)します。そしてインスタンス化されたオブジェクトから「GetMethod」メソッドを通ってメソッドのオブジェクトを取得してInvoke(実行)することでリフレクションタイプを実装したものです。



上の例だけみるとなぜreflectionタイプに実装するかを分かりません。



上の例を見ると「Print1」、「Print2」、「Print3」、「Print4」、「Print5」を呼び出すメソッド「Program.Print」で呼び出すメソッドを決めることではなくて「Program.Print」メソッドを呼ばせる外部からメソッド種類を決める形になっています。 すなわち、プログラムのメソッドを呼び出す仕方で実装する時に決めることではなく、外部入力ことでメソッド処理を制御ができる意味になります。



そうするとreflection(リフレクション)の種類について調べてみます。


リフレクション関数 説明
GetConstructor(Type[]) コンストラクタを取得するメソッド
GetConstructors() すべてのコンストラクタを取得するメソッド
GetEvent(String) イベントを取得するメソッド
GetEvents() すべてのイベントを取得するメソッド
GetCustomAttributes(Boolean) アトリビュートを取得するメソッド
GetCustomAttributes(Type, Boolean) すべてのアトリビュートを取得するメソッド
GetField(String) デリゲートフィールドを取得するメソッド
GetFields() すべてのデリゲートフィールドを取得するメソッド
GetMember(String) メンバオブジェクト(プロセス修飾子がpublicになっているもの)を取得するメソッド
GetMembers() メンバオブジェクト(プロセス修飾子がpublicになっているもの)を取得するメソッド
GetMethod(String) メソッドを取得するメソッド
GetMethods() すべてのメソッドを取得するメソッド
GetProperty(String) プロパテイを取得するメソッド
GetProperties() すべてのプロパテイを取得するメソッド

参考リンク - MicrosoftのMSDN - Type クラス




今までreflection(リフレクション)について勉強しました。前の投稿で勉強したことで「dynamic」もreflection(リフレクション)種類の中で1つですね。
実際にプログラムを実装する時に動的な実装スタイルでreflectionをよく使うし、プログラムを制御するようなプログラムに様々スタイルで応用ができます。
でも、reflectionは静的に実装することよりは遅いし、ソースコードが難しくなって可読性が悪くなる問題があります。それを考えて使うとreflection(リフレクション)はいい文法だと思います。

0 件のコメント