はいどうもこんにちは。今回のコースは、.NETのC#におけるReflection(リフレクション)に関するコースです。
Reflectionとは、コンパイル時に型が決まらないシナリオに対応させたいときに使う技術のことです。
図0-1 このコースで扱うReflectionの範囲(Assembly/Module/Type、Field・Method・Constructor・Property・Event、そしてdynamic)
Reflectionで何ができるか
例えば、実行するときにメソッドの名前を動的に変えたい、といったケースが挙げられます。「SendA」というメソッドか「SendB」というメソッドかを、設定ファイルの内容によって切り替えたい、あるいは取得したいプロパティを切り替えたい、といった場面です。
図0-2 コンパイル時に型が決まらないシナリオに対応するための技術がReflection
図0-3 呼び出すメソッド名(”SendA”/”SendB”)を実行時に切り替えたい、というシナリオの例
また、クラスの情報やメンバーの情報(メソッド、イベント、プロパティなど)を取得することもできます。あるクラスにはどんなメソッドがあるか、といった一覧を取得することも可能です。
図0-4 取得したいプロパティを実行時に切り替えたい、というシナリオの例
図0-5 クラスやメンバー(Field・Method・Constructor・Property・Event)の情報を取得する
Reflectionの活用例
こうしたことができると何がいいかというと、例えばテストツールやDIツール、Entity Frameworkといったツールが、メソッドを探したり動的に実行したりすることで機能を実現しています。今回のコースでは、そのReflectionの技術に絞って解説します。
図0-6 テストツール・DIツール・Entity FrameworkなどもReflectionを活用している
dynamicとの組み合わせ
最後に、C# 4.0から使えるようになっているdynamicという型を使えば、Reflectionとdynamicを組み合わせて簡単にReflectionを書ける書き方もあるので、それをコースの最後に解説します。
図0-7 コースの後半ではReflection+dynamicの組み合わせ方を解説する
このコースの進め方
コースの中ではプログラムを作っていきますが、こんな感じでボタンを置きながらプログラムを書いていきます。
図0-8 解説ごとにボタンを配置しながらデモを作っていく
図0-9 フォームデザイナー上でボタンを配置している様子
この中には、例えばMethodInfoの中はこう書く、といった形でコードを紹介しながら解説していきます。後で「どう書くんだっけ」となったときに、そのMethodInfoの部分を見てもらえば「ああ、こう書くんだ」とパッと思い出せるように、カタログ的というか辞書的な感じでボタンを置きながら解説しているので、出来上がってから見返すのも簡単になればいいなと思ってやっています。
そんな感じでコースを受けていただいて、今後また使いたいなと思ったタイミングでこれを見てもらったら、こう書くんだなというのが思い出せると思います。そんな感じのコースになっていますので、興味のある方はぜひご覧になってみてください。
目次
はじめに
A01_はじめに
A02_コースの概要
Type
B01_Typeクラスとは
B02_型からTypeを取得する
B03_自前の型からTypeを取得する
B04_インスタンスからTypeを取得する
B05_Typeのインスタンスは1つだけ
Assembly
C01_Assemblyとは
C02_Assemblyの生成_実行中のアセンブリを取得
C03_Assemblyの生成_アセンブリ名で取得
C04_Assemblyの生成_パスを指定して取得
C05_Assemblyの生成_呼び出し元を取得
C06_Assemblyの生成_型から取得
C07_すべての型を取得する
C08_publicな型だけを取得する
C09_名前を指定して型を取得する
C10_メタ情報の取得
インスタンスの生成
D01_インスタンスの生成
D02_インスタンス生成後の具体例
D03_空のコンストラクタがないとエラーになる
D04_Activatorを使ったインスタンスの生成
D05_引数ありのコンストラクタで生成する方法
ConstructorInfo
E01_コンストラクタの情報を取得
E02_パラメータの情報を取得
E03_コンストラクタの情報からインスタンスを生成する
E04_コンストラクタを検索して生成する
E05_public以外のコンストラクタを取得
E06_staticなコンストラクタがある場合の注意点
E07_コンストラクタのアクセスレベルを取得する
MethodInfo
F01_MethodInfo
F02_引数ありのメソッド呼び出し
F03_メソッドがオーバーロードされているときの指定方法
F04_GetMethods
F05_属性で取得する
F06_staticメソッドを呼び出す
F07_戻り値を取得する
PropertyInfo
G01_PropertyInfo
G02_GetProperties
G03_属性を使ったチェック
G04_汎用的なチェックメソッド
G05_CanWrite
FieldInfo
H01_FieldInfo
H02_public以外のFieldInfo
EventInfo
J01_EventInfoとは
J02_AddEventHandler
J03_EventInfoの注意点
J04_RemoveEventHandler
dynamicを利用したリフレクション
K01_dynamicを利用したリフレクション
K02_dynamicを利用したメソッドの呼び方
K03_オーバーライドされたメソッドの呼び出し
K04_メソッドの存在チェック
K05_dynamicを利用したプロパティへのアクセス
K06_dynamicを利用したフィールドへのアクセス
K07_dynamicを利用したイベントへのアクセス