GetType は、ディスクから読み込まれたアセンブリ上だけで動作します。System.Reflection.Emit サービスを使用して定義した動的アセンブリ内で定義した型を検索するために GetType を呼び出すと、矛盾する動作が発生する可能性があります。その動作は、動的アセンブリが永続的かどうかによって異なります。つまり、その動的アセンブリが System.Reflection.Emit.AssemblyBuilderAccess 列挙体の RunAndSave アクセス モードまたは Save アクセス モードのどちらを使用して作成されたかによって異なります。動的アセンブリが永続的で、GetType が呼び出される前にディスクに書き込まれている場合、ローダーはディスク上に保存されているアセンブリを見つけて読み込み、そのアセンブリから型を取得します。GetType が呼び出された時点でアセンブリがディスク上に保存されていない場合、このメソッドは null 参照 (Visual Basic では Nothing) を返します。GetType は一時動的アセンブリを認識しないため、一時動的アセンブリ内の型を取得するために GetType を呼び出すと、null 参照 (Visual Basic では Nothing) が返されます。
動的モジュールの GetType を使用するには、AppDomain.AssemblyResolve イベントをサブスクライブし、保存する前に GetType を呼び出します。保存する前に呼び出さないと、メモリに 2 つのコピーが作成されることになります。
要求された型がパブリックではなく、呼び出し元に現在のアセンブリ外の非パブリック オブジェクトをリフレクションするための ReflectionPermission がない場合、このメソッドは null 参照 (Visual Basic では Nothing) を返します。
型に対するリフレクション時に Get メソッドによって返される基本クラスのメンバを次の表に示します。
| メンバ型 | 静的 | 非静的 |
| コンストラクタ | いいえ | いいえ |
| フィールド | いいえ | はい。フィールドは常に名前と署名によって隠ぺいされます。 |
| イベント | 適用なし | 共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。 |
| メソッド | いいえ | はい。メソッド (仮想メソッドと非仮想メソッドの両方) は、名前によって隠蔽することもできますし、名前と署名によって隠蔽することもできます。 |
| 入れ子にされた型 | いいえ | いいえ |
| プロパティ | 適用なし | 共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。 |
-
名前と署名による隠ぺいでは、カスタム修飾子、戻り値の型、パラメータの型、sentinel、およびアンマネージ呼び出し規約を含めて、署名のすべての部分が判断の対象となります。これはバイナリ比較です。
-
リフレクションの場合、プロパティおよびイベントは名前と署名によって隠ぺいされています。基本クラスに get アクセサと set アクセサの両方を持つプロパティがあり、派生クラスには get アクセサしかない場合、派生クラスのプロパティにより基本クラスのプロパティが隠ぺいされ、基本クラスの set アクセサにはアクセスできません。
-
カスタム属性は、共通型システムの一部ではありません。
使用できるクラスのテーブルに事前に読み込まれていない限り、配列や COM 型は検索対象になりません。
typeName には、単純型名、名前空間を含む型名、またはアセンブリ名の指定を含む複合名を指定できます。
typeName に Type の名前だけが含まれている場合、このメソッドは最初に呼び出し元のオブジェクトのアセンブリで検索を行い、次に mscorlib.dll アセンブリで検索を行います。typeName が部分アセンブリ名または完全アセンブリ名で完全限定されている場合、このメソッドは指定されたアセンブリで検索を行います。
AssemblyQualifiedName は、入れ子にされた型、アセンブリ名、およびジェネリック型引数を含む完全修飾型名を返すことができます。入れ子になったクラスに対して、共通言語ランタイムをサポートするすべてのコンパイラは簡易名を生成し、リフレクションが、照会されたときに次の規則に従って完全限定名を生成します。
| 区切り記号 | 意味 |
| 円記号 (\) | エスケープ文字。 |
| コンマ (,) | アセンブリ名の前に置きます。 |
| プラス記号 (+) | 入れ子になったクラスの前に置きます。 |
| ピリオド (.) | 名前空間識別子を示します。 |
| 角かっこ ([]) | ジェネリック型引数リストを囲みます。構築ジェネリック型の場合、型引数リスト内で、アセンブリ修飾型を囲みます。 |
たとえば、クラスの完全限定名は次のようになります。
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
名前空間が TopNamespace.Sub+Namespace である場合、プラス記号 (+) が、入れ子になったクラスの区切り文字として解釈されないように、プラス記号 (+) の前にエスケープ文字 (\) を付ける必要があります。リフレクションは、この文字列を次のように生成します。
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
"++" は "\+\+"、"\" は "\\" となります。
この完全限定名は永続化でき、後で Type を読み込むために使用できます。Type を検索して読み込むには、型名だけ、またはアセンブリ修飾型名のいずれかを指定して GetType を使用します。型名だけを指定して GetType を使用した場合は、呼び出し元のアセンブリの Type だけが検索され、次に System アセンブリが検索されます。アセンブリ修飾型名を指定して GetType を使用した場合は、任意のアセンブリ内の Type が検索されます。
型名の末尾には、その型に関する追加情報を示す文字を追加できます。たとえば、その型が参照型か、ポインタ型か、配列型かなどを表す文字を追加できます。このような末尾の文字を除いて型名だけを取得するには、t.GetElementType().ToString() を使用します。t が型を示します。
アセンブリ名を除くすべての型名コンポーネントで、スペースには意味があります。アセンブリ名では、区切り記号 ',' の前のスペースには意味がありますが、区切り記号 ',' の後のスペースは無視されます。
ジェネリック型の場合、型引数リストは角かっこで囲まれ、型引数はコンマで区切られます。たとえば、ジェネリック型の Dictionary には 2 種類のパラメータがあります。型 String のキーを持つ MyType の Dictionary は、次のように表されます。
System.Collections.Generic.Dictionary`2[System.String,MyType]
型引数リスト内のアセンブリ修飾型を指定するには、アセンブリ修飾型を角かっこで囲みます。囲まなかった場合、アセンブリ修飾名の各部分を区切るコンマが追加の区切りの型引数として解釈されます。たとえば、型 String のキーを持つ、MyAssembly.dll からの MyType の Dictionary は、次のように指定できます。
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]") メモ |
|---|
| アセンブリ修飾型を角かっこで囲むことができるのは、型パラメータ リスト内に存在する場合のみです。修飾型および非修飾型のアセンブリを型パラメータ リストで検索する規則は、修飾および非修飾の非ジェネリック型を検索する規則と同じです。 |
さまざまな種類の GetType で使用する構文を次の表に示します。
| 取得対象 | 使用方法 |
| MyType へのアンマネージ ポインタ | Type.GetType("MyType*") |
| MyType へのアンマネージ ポインタ | Type.GetType("MyType**") |
| MyType へのマネージ ポインタまたは参照 | Type.GetType("MyType&")。ポインタとは異なり、参照は、1 レベルに限定されることに注意してください。 |
| 親クラスと入れ子になったクラス | Type.GetType("MyParentClass+MyNestedClass") |
| 下限 0 の 1 次元配列 | Type.GetType("MyType[]") |
| 下限が不明の 1 次元配列 | Type.GetType("MyType[*]") |
| n 次元配列 | 角かっこ内のコンマ (,) の合計数は、n-1 になります。たとえば、System.Object[,,] は、3 次元の Object 配列を表します。 |
| 1 次元配列の配列 | Type.GetType("MyType[][]") |
| 下限が不明の四角形 2 次元配列 | Type.GetType("MyType[*,*]") または Type.GetType("MyType[,]") |
| 1 つの型引数を持つジェネリック型 | Type.GetType("MyGenericType`1[MyType]") |
| 2 つの型引数を持つジェネリック型 | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
| 2 つのアセンブリ修飾型引数を持つジェネリック型 | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
| アセンブリ修飾型引数を持つアセンブリ修飾ジェネリック型 | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
| 2 つの型引数を持つジェネリック型である型引数を持つジェネリック型 | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |