Reflection(リフレクション)を使ってインスタンスを生成する [C#]

Reflection(リフレクション)を使ってインスタンスを生成する C#

.NETにはリフレクション(System.Reflection名前空間)という仕組みが用意されており、アセンブリや、アセンブリに定義されているクラス、インターフェース、構造体、列挙体などに関する情報を取得したり、プログラムの実行時に型のインスタンスを作成したり、作成した型インスタンスを呼び出したり、アクセスしたりすることができます。

今回は、リフレクション(Reflection)を使用して、クラスや構造体などのオブジェクトのインスタンスを生成する方法を紹介します。

オブジェクトの型を取得する

Reflectionを使ってインスタンスを生成(オブジェクトを作成)するには、まずオブジェクトの型(Type)を取得します。

オブジェクトの型オブジェクトを取得する方法については、以下の記事を参考にしてください。

オブジェクトの型オブジェクトを取得する [C#]
オブジェクトの型オブジェクト(System.Typeのインスタンス)を取得する方法を紹介します。 本記事に記載のコードでは、以...

オブジェクトのインスタンスを生成する

クラスや構造体のオブジェクトのインスタンスを生成するには、TypeクラスのCreateInstanceメソッドを使用します。CreateInstanceメソッドには、パラメーター(引数)にタイプ名(Type.FullName)を指定するものと、その他に2つのオーバーロードが用意されています。

CreateInstanceのオーバーロード

CreateInstance(String)

パラメーター(引数)を1つ指定するCreateInstanceメソッドの構文は、次のようになります。

パラメーター(引数)にインスタンスを生成する型の名前(フルネーム)を指定します。
フルネームはTypeクラスのFullNameプロパティで取得することができます。

CreateInstance(String, Boolean)

パラメーター(引数)を2つ指定するCreateInstanceメソッドの構文は、次のようになります。

1つ目のパラメーター(引数)にインスタンスを生成する型の名前(フルネーム)を指定します。

2つ目のパラメーター(引数)には指定された型の名前からインスタンスを生成する際に、大文字と小文字を区別するかどうかを示す値を指定します。大文字と小文字の違いを区別しない場合はTrueを指定します。

CreateInstance(String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])

パラメーター(引数)を2つ指定するCreateInstanceメソッドの構文は、次のようになります。

1つ目のパラメーター(引数)にインスタンスを生成する型の名前を指定します。

2つ目のパラメーター(引数)に大文字と小文字を区別するかどうかを示す値を指定します。大文字と小文字の違いを区別しない場合はTrueになります。

3つ目のパラメーター(引数)にはインスタンスの生成方法を表すバインディングフラグを指定します。
指定するフラグには、System.Reflection名前空間にあるBindingFlags列挙型のフィールド値を指定します。

BindingFlags 列挙型

4つ目のパラメーター(引数)にはバインディング、引数型の強制変換、メンバーの呼び出し、および、リフレクションによるMemberInfoオブジェクトの取得を有効にするオブジェクトのバインダーを指定します。
指定するバインダーには、System.Reflection名前空間にあるBinderクラスのインスタンスを指定します。

Binder クラス

このパラメーター(引数)にnullした場合は、既定のバインダーが使用されます。
5つ目のパラメーター(引数)にはコンストラクターに渡す引数を配列で指定します。
このパラメーター(引数)にnull、または空の配列を指定した場合は、パラメーターなしのコンストラクターが使用されます。

6つ目のパラメーター(引数)にはカルチャー情報を指定します。
指定するカルチャー情報には、System.Globalization名前空間にあるCultureInfoクラスのインスタンスを指定します。

CultureInfo クラス

このパラメーター(引数)にnullした場合は、現在のスレッドのカルチャー情報が使用されます。

7つ目のパラメーター(引数)にはアクティベーション属性を配列で設定します。

CreateInstanceメソッドの使用例

CreateInstanceメソッドを使って、System.Windows.Forms名前空間にあるFormクラスのインスタンスを生成する例を示します。

ReflectionのAssemblyクラスのCreateInstanceメソッドで生成したフォーム

参考 Reflection Tips
.NET Reflection(リフレクション)Tips コードスニペット一覧 [C#]
.NETのReflection(リフレクション)を使ったTipsのコードスニペット集です。 本記事に記載のコードでは、以下のu...