.NET Reflection(リフレクション)Tips コードスニペット一覧 [C#]

.NET リフレクション Tips コードスニペット Reflection C#

.NETのReflection(リフレクション)を使ったTipsのコードスニペット集です。

本記事に記載のコードでは、以下のusingディレクティブの記述が必要になります。

本文中では、usingの記述を省略しています。

本記事では、以下のユーザー定義クラスを使用します。

リフレクションとは

.NETを用いて作成されているプログラムやライブラリーなどのオブジェクトが持つ情報にアクセスし、データを取得、設定したり、作成したり、実行したりできる「メタデータ」を操作するための仕組みです。

リフレクションを使うと、アセンブリや、アセンブリに定義されているクラス、インターフェース、構造体、列挙体などに関する情報を取得したり、プログラムの実行時に型のインスタンスを作成したり、作成した型インスタンスを呼び出したり、アクセスしてデータを設定したりすることができます。

リフレクションはオブジェクトの型情報をもとに操作します。

目次

型オブジェクト(Type型のインスタンス)を取得する

リフレクション(Reflection)を使用するには、まず型のオブジェクトを取得します。
型オブジェクト(System.Type型のインスタンス)を取得(生成)する方法はいくつかあります。

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

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

型の名前を取得する

型の名前を取得するには、TypeクラスのNameプロパティを使用します。

型のフルネームを取得する

型のフルネームを取得するには、TypeクラスのFullNameプロパティを使用します。

型のアセンブリ修飾名を取得する

型のアセンブリ修飾名を取得するには、TypeクラスのAssemblyQualifiedNameプロパティを使用します。

型の名前空間を取得する

型の名前空間を取得するには、TypeクラスのNamespaceプロパティを使用します。

型のTypeCodeを取得する

型のTypeCodeを取得するには、TypeクラスのTypeCode静的メソッドを使用します。

オブジェクトが指定した型と同一かどうかを判定する

オブジェクトが指定した型と同一かどうかを判定するには、==演算子を使用します。

オブジェクトが指定した型に代入できるかどうかを判定する

オブジェクトが指定した型に代入できるかどうかを判定するには、is演算子を使用します。

配列かどうかを判定する

配列かどうかを判定するには、TypeクラスのIsArrayプロパティを使用します。

ジェネリック型かどうかを判定する

ジェネリック型かどうかを判定するには、TypeクラスのIsGenericTypeプロパティを使用します。

ジェネリック型の型パラメーター(型引数)の型を取得する

ジェネリック型の型パラメーター(型引数)の型を取得するには、TypeクラスのGetGenericArgumentsメソッドを使用します。

ジェネリック型を構築する元になるジェネリック型の型を取得する

ジェネリック型を構築する元になるジェネリック型の型を取得するには、TypeクラスのGetGenericTypeDefinitionメソッドを使用します。

値型かどうかを判定する

値型かどうかを判定するには、TypeクラスのIsValueTypeプロパティを使用します。

クラスかどうかを判定する

クラスかどうかを判定するには、TypeクラスのIsClassプロパティを使用します。

ジェネリッククラスかどうかを判定する

ジェネリッククラスかどうかを判定するには、TypeクラスのIsGenericTypeプロパティと、TypeクラスのIsClassプロパティを組み合わせて使用します。

List<T>型かどうかを判定する

List<T>型かどうかを判定するには、TypeクラスのGetGenericTypeDefinitionメソッドで取得した型が、List<>型であるかどうかを調べます。

インターフェースかどうかを判定する

インターフェースかどうかを判定するには、TypeクラスのIsInterfaceプロパティを使用します。

プリミティブ型かどうかを判定する

プリミティブ型かどうかを判定するには、TypeクラスのIsPrimitiveプロパティを使用します。

非ジェネリックコレクションかどうかを判定する

非ジェネリックコレクションかどうかを判定するには、TypeクラスのIsAssignableFromメソッドを使用して型が、IEnumerable型に割り当てできるかどうかを検査し、尚且つ文字列(string)型でないかどうかを調べます。

列挙型(enum)かどうかを判定する

列挙型(enum)かどうかを判定するには、TypeクラスのIsEnumプロパティを使用します。

列挙型(enum)の値に対応する列挙子(フィールド名)を取得する

列挙型(enum)の値に対応する列挙子(フィールド名)を取得するには、TypeクラスのGetEnumNameメソッドを使用します。

列挙型(enum)の列挙子(フィールド名)の一覧を取得する

列挙型(enum)の列挙子(フィールド名)の一覧を取得するには、TypeクラスのGetEnumNamesメソッドを使用します。

列挙型(enum)に定義されている値かどうかを判定する

列挙型(enum)に定義されている値かどうかを判定するには、TypeクラスのIsEnumDefinedメソッドを使用します。

構造体かどうかを判定する

構造体かどうかを判定するには、まずTypeクラスのIsValueTypeメソッドで値型どうかを判定します。
値型の場合は同じくTypeクラスのIsPrimitiveメソッド、IsEnumメソッド、IsGenericTypeメソッドで、プリミティブ型ではないか、列挙型ではないか、ジェネリック型ではないかを判定します。
上記すべての条件に合致する場合は構造体になると判断します。

型のアセンブリを取得する

型のアセンブリを取得するには、TypeクラスのAssemblyプロパティを使用します。

アセンブリのフルネームを取得する

アセンブリのフルネームを取得するには、AssemblyクラスのFullNameプロパティを使用します。

アセンブリの場所を取得する

アセンブリの場所を取得するには、AssemblyクラスのLocationプロパティを使用します。

アセンブリ名の詳細を取得する

アセンブリのフルネームを取得するには、AssemblyクラスのGetNameメソッドを使用します。

アセンブリのバージョンを取得する

アセンブリのバージョンを取得するには、AssemblyNameクラスのVersionプロパティを使用します。

アセンブリの簡易名を取得する

アセンブリのバージョンを取得するには、AssemblyNameクラスのNameプロパティを使用します。

アセンブリに定義されている型を取得する

アセンブリに定義されている型を列挙するには、AssemblyクラスのGetTypesメソッドを使用します。

アセンブリに含まれるpublicな型を取得する

アセンブリに含まれるpublicな型を列挙するには、AssemblyクラスのGetTypesメソッドで取得できる型(Type)のうち、TypeクラスのIsPublicプロパティがTrueの型のみを対象にします。

実行中のコードを含むアセンブリを取得する

実行中のコードを含むアセンブリを取得するには、AssemblyクラスのGetExecutingAssembly静的メソッドを使用します。

実行中のエントリポイントを含むアセンブリを取得する

実行中のエントリポイントを含むアセンブリ(既定のアプリケーション ドメインで実行できるプロセスであるアセンブリ)を取得するには、AssemblyクラスのGetEntryAssembly静的メソッドを使用します。

アセンブリ名からアセンブリをロードする

アセンブリ名からアセンブリを動的にロードするには、AssemblyクラスのLoad静的メソッドを使用します。

ファイル名(パス)からアセンブリーをロードする

ファイル名(パス)からアセンブリーを動的にロードするには、AssemblyクラスのLoadFrom静的メソッドを使用します。

アセンブリ内のクラスのインスタンスを生成する

アセンブリ内のクラスのインスタンスを生成するには、ActivatorクラスのCreateInstance静的メソッドを使用します。

クラスのインスタンスはAssemblyクラスのCreateInstanceメソッドで生成することもできます。

アセンブリのモジュール(dll/exe)を取得する

アセンブリのモジュール(dll/exe)を取得するには、AssemblyクラスのModulesプロパティを使用します。

型のモジュール(dll/exe)を取得する

型のモジュール(dll/exe)を取得するには、TypeクラスのModuleプロパティを使用します。

引数なしのコンストラクターを取得する

引数なしのコンストラクターを取得するには、TypeクラスのGetConstructorメソッドを使用します。

引数なしのコンストラクターからインスタンスを生成する

引数なしのコンストラクターを呼び出してインスタンスを生成するには、ConstructorInfoクラスのInvokeメソッドを使用します。

引数ありのコンストラクターを取得する

引数ありのコンストラクターを取得するには、TypeクラスのGetConstructorメソッドのパラメーター(引数)に、コンストラクターのパラメーター(引数)の型を指定します。

引数ありのコンストラクターからインスタンスを生成する

引数ありのコンストラクターを呼び出してインスタンスを生成するには、ConstructorInfoクラスのInvokeメソッドのパラメーター(引数)に、コンストラクターのパラメーター(引数)に指定するオブジェクトを指定します。

親クラス(ベースクラス)の型を取得する

親クラス(ベースクラス)を取得するには、TypeクラスのBaseTypeプロパティを使用します。

特定のクラスのサブクラス(派生クラス)かどうかを判定する

特定のクラスから派生されたかどうかを判定するには、TypeクラスのIsSubclassOfメソッドを使用します。

実装しているインターフェースの一覧を取得する

実装しているインターフェースの一覧を取得するには、TypeクラスのGetInterfacesメソッドを使用します。

パブリックフィールドを取得する

パブリックフィールドを取得するには、TypeクラスのGetFieldsメソッドを使用します。

パブリックプロパティを取得する

パブリックプロパティを取得するには、TypeクラスのGetPropertiesメソッドを使用します。

パブリックメソッドを取得する

パブリックメソッドを取得するには、TypeクラスのGetMethodsメソッドを使用します。

インスタンスフィールドを取得する

インスタンスフィールドを取得するには、TypeクラスのGetFieldsメソッドの引数に、BindingFlags列挙型のInstanceとPublicを指定します。

インスタンスプロパティを取得する

インスタンスプロパティを取得するには、TypeクラスのGetPropertiesメソッドの引数に、BindingFlags列挙型のInstanceとPublicを指定します。

インスタンスメソッドを取得する

インスタンスメソッドを取得するには、TypeクラスのGetMethodsメソッドの引数に、BindingFlags列挙型のInstanceとPublicを指定します。

静的フィールドを取得する

静的フィールドを取得するには、TypeクラスのGetFieldsメソッドの引数に、BindingFlags列挙型のStaticとPublicを指定します。

静的プロパティを取得する

静的プロパティを取得するには、TypeクラスのGetPropertiesメソッドの引数に、BindingFlags列挙型のStaticとPublicを指定します。

静的メソッドを取得する

静的メソッドを取得するには、TypeクラスのGetMethodsメソッドの引数に、BindingFlags列挙型のStaticとPublicを指定します。

非パブリックフィールドを取得する

非パブリックフィールドを取得するには、TypeクラスのGetFieldsメソッドの引数に、BindingFlags列挙型のNonPublicを指定します。

非パブリックプロパティを取得する

非パブリックプロパティを取得するには、TypeクラスのGetPropertiesメソッドの引数に、BindingFlags列挙型のNonPublicを指定します。

非パブリックメソッドを取得する

非パブリックメソッドを取得するには、TypeクラスのGetMethodsメソッドの引数に、BindingFlags列挙型のNonPublicを指定します。

現在実行されているメソッドを取得する

現在実行されているメソッドを取得するには、MethodBaseクラスのGetCurrentMethod静的メソッドを使用します。

メソッド名を取得する

メソッド名を取得するには、MethodBaseクラスのNamePropertyを使用します。

メソッドが定義されているクラスを取得する

メソッドが定義されているクラス(の型)を取得するには、MethodBaseクラスのDeclaringTypeプロパティを使用します。

クラスで定義されたメソッドのみ取得する

クラスで定義されたメソッドのみ取得するには、TypeクラスのGetMethodsで取得したメソッド(MethodInfo)のうち、DeclaringTypeプロパティがクラスの型と一致するメソッドのみ抜き出します。

特定のフィールドを取得する

特定のフィールドを取得するには、TypeクラスのGetFieldメソッドを使用します。

特定のプロパティを取得する

特定のプロパティを取得するには、TypeクラスのGetPropertyメソッドを使用します。

特定のメソッドを取得する

特定のメソッドを取得するには、

インスタンス・メソッドを呼び出す(引数なし)

インスタンス・メソッドを引数なしで呼び出すには、MethodInfoクラスのInvokeメソッドを使用します。

インスタンス・メソッドを呼び出す(引数あり)

インスタンス・メソッドを引数ありで呼び出すには、MethodInfoクラスのInvokeメソッドのパラメーター(引数)に、呼び出すメソッドのパラメーター(引数)を指定します。

静的メソッドを呼び出す(引数なし)

静的メソッドを引数なしで呼び出すには、MethodInfoクラスのInvokeメソッドのパラメーター(引数)に、Nullを指定します。

静的メソッドを呼び出す(引数あり)

静的メソッドを引数ありで呼び出すには、MethodInfoクラスのInvokeメソッドのパラメーター(引数)に、Nullと呼び出すメソッドのパラメーター(引数)を指定します。

メソッドのパラメーター(引数)を取得する

メソッドのパラメーター(引数)を取得するには、MethodInfoクラスのGetParametersメソッドを使用します。

メソッドの戻り値を取得する

メソッドの戻り値を取得するには、MethodInfoクラスのReturnParameterプロパティを使用します。

メソッドの戻り値の型を取得する

メソッドの戻り値の型を取得するには、MethodInfoクラスのReturnTypeプロパティを使用します。

プロパティの型を取得する

プロパティの型を取得するには、PropertyInfoクラスのPropertyTypeプロパティを使用します。

プロパティの値を取得する

プロパティの値を取得するには、PropertyInfoクラスのGetValueメソッドを使用します。

プロパティに値を設定する

プロパティに値を設定するには、PropertyInfoクラスのSetValueメソッドを使用します。

読み取り可能なプロパティかどうかを判定する

読み込み可能なプロパティかどうかを判定するには、PropertyInfoクラスのCanReadプロパティを使用します。

書き込み可能なプロパティかどうかを判定する

書き込み可能なプロパティかどうかを判定するには、PropertyInfoクラスのCanWriteプロパティを使用します。

プロパティがNull許容型(Nullable<T>型)かどうかを判定する

プロパティがNullable<T>型かどうかを判定するには、TypeクラスのGetGenericTypeDefinitionメソッドの戻り値が、Nullable<>型かどうかを検査します。

指定した属性が関連付けられているかどうかを判定する

指定した属性が関連付けられているかどうかを判定するには、TypeクラスのIsDefinedメソッドを使用します。

型に関連付けられている属性を取得する

型に関連付けられている属性を取得するには、TypeクラスのAttributesプロパティを使用します。

型に関連付けられているカスタム属性を含むコレクションを取得する

型に関連付けられているカスタム属性を含むコレクションを取得するには、TypeクラスのCustomAttributesプロパティ、またはGetCustomAttributesDataメソッドを使用します。

型に関連付けられている特定の型の属性を取得する

クラスに付加された特定の属性を取得するには、TypeクラスのGetCustomAttributeメソッド、またはGetCustomAttribute<T>メソッドを使用します。

プロパティに関連付けられている属性を取得する

型に関連付けられている属性を取得するには、PropertyInfoクラスのAttributesプロパティを使用します。

プロパティに関連付けられているカスタム属性を含むコレクションを取得する

プロパティに関連付けられているカスタム属性を含むコレクションを取得するには、PropertyInfoクラスのCustomAttributesプロパティ、またはGetCustomAttributesDataメソッドを使用します。

プロパティに関連付けられている特定の型の属性を取得する

プロパティに関連付けられている特定の型の属性を取得するには、PropertyInfoクラスのGetCustomAttributeメソッド、またはGetCustomAttribute<T>メソッドを使用します。

メソッドに関連付けられている属性を取得する

型に関連付けられている属性を取得するには、MethodInfoクラスのAttributesプロパティを使用します。

メソッドに関連付けられているカスタム属性を含むコレクションを取得する

メソッドに関連付けられているカスタム属性を含むコレクションを取得するには、MethodInfoクラスのCustomAttributesプロパティ、またはGetCustomAttributesDataメソッドを使用します。

メソッドに関連付けられている特定の型の属性を取得する

メソッドに関連付けられている特定の型の属性を取得するには、MethodInfoクラスのGetCustomAttributeメソッド、またはGetCustomAttribute<T>メソッドを使用します。

型のメンバーを取得する

型のメンバーを取得するには、TypeクラスのGetMembersメソッドを使用します。

名前を指定して型のメンバーを取得する

名前を指定して型のメンバーを取得するには、TypeクラスのGetMemberメソッドを使用します。

メンバーの種類を取得する

メンバーの種類を取得するには、TypeクラスのGetMemberメソッドを使用します。

すべてのフィールドを取得する

すべてのフィールドを取得するには、TypeクラスのGetRuntimeFieldsメソッドを使用します。

すべてのプロパティを取得する

すべてのプロパティを取得するには、TypeクラスのGetRuntimePropertiesメソッドを使用します。

すべてのメソッドを取得する

すべてのメソッドを取得するには、TypeクラスのGetRuntimeMethodsメソッドを使用します。

すべてのイベントを取得する

すべてのイベントを取得するには、TypeクラスのGetRuntimeEventsメソッドを使用します。