System.Type.GetType メソッド
この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。
メソッドの既定のGetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)実装をより柔軟な実装GetTypeに置き換えるには、メソッド オーバーロードとそれに関連付けられているオーバーロード (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)およびGetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) を使用します。 型名とその型を含むアセンブリの名前を解決する独自のメソッドを提供することで、次の操作を実行できます。
- 型の読み込み元のアセンブリのバージョンを制御します。
- アセンブリ名を含まない型名を検索する別の場所を指定します。
- 部分アセンブリ名を使用してアセンブリを読み込みます。
- System.Type共通言語ランタイム (CLR) によって作成されていないサブクラスを返します。
たとえば、バージョン トレラントなシリアル化では、このメソッドを使用すると、部分名を使用して "最適な" アセンブリを検索できます。 メソッドの他の GetType オーバーロードには、バージョン番号を含むアセンブリ修飾型名が必要です。
型システムの代替実装では、CLR によって作成されていないサブクラスを返す必要がある場合があります。メソッドの System.Type 他のオーバーロード GetType によって返されるすべての型はランタイム型です。
使用上の注意
このメソッド オーバーロードとそれに関連付けられているオーバーロードは、型の名前とアセンブリの名前を解析 typeName
し、名前を解決します。 型名はアセンブリのコンテキストで解決する必要があるため、型名の解決前にアセンブリ名の解決が行われます。
Note
アセンブリ修飾型名の概念に慣れていない場合は、プロパティを AssemblyQualifiedName 参照してください。
アセンブリ修飾名でない場合 typeName
、アセンブリ解決はスキップされます。 修飾されていない型名は、mscorlib.dll/System.Private.CoreLib.dll または現在実行中のアセンブリのコンテキストで解決できます。また、必要に応じて、パラメーターにアセンブリを typeResolver
指定することもできます。 異なる種類の名前解決に対してアセンブリ名を含めるか省略した場合の効果は、[名前解決の混在] セクションにテーブルとして表示されます。
一般的な使用上の注意事項:
メソッド
assemblyResolver
は、不明またはtypeResolver
信頼されていない呼び出し元に渡したり、呼び出し元に渡したりしないでください。 指定したメソッドまたは使い慣れているメソッドだけを使用してください。注意事項
不明な呼び出し元または信頼されていない呼び出し元のメソッドを使用すると、悪意のあるコードに対する特権が昇格される可能性があります。
パラメーターや
typeResolver
パラメーターをassemblyResolver
省略すると、既定の解決をthrowOnError
実行するメソッドにパラメーターの値が渡されます。if
throwOnError
istrue
, this method throws a TypeLoadException whentypeResolver
returnsnull
, and a FileNotFoundException whenassemblyResolver
returnsnull
.このメソッドは、and によってスローされた例外を
assemblyResolver
typeResolver
キャッチしません。 リゾルバー メソッドによってスローされる例外については、ユーザーが責任を負います。
アセンブリを解決する
このメソッドは assemblyResolver
オブジェクトを AssemblyName 受け取ります。オブジェクトは、に含まれる typeName
文字列アセンブリ名を解析することによって生成されます。 アセンブリ名が含まれていない場合 typeName
は、 assemblyResolver
呼び出 null
されずに typeResolver
渡されます。
指定しない場合 assemblyResolver
は、標準アセンブリプローブを使用してアセンブリを検索します。 指定した場合 assemblyResolver
、 GetType メソッドは標準のプローブを実行しません。その場合は、渡すすべてのアセンブリを確実に処理できるようにする必要があります assemblyResolver
。
アセンブリを assemblyResolver
解決できない場合は、メソッドが返されます null
。 戻り値null
が返された場合assemblyResolver
、typeResolver
呼び出されず、それ以上の処理は行われません。さらに、ある場合throwOnError
はtrue
、a FileNotFoundException がスローされます。
AssemblyName渡されるassemblyResolver
部分名が部分名の場合、その部分の 1 つ以上は null
. たとえば、バージョンがない場合、 Version プロパティは null
. Versionプロパティ、プロパティ、CultureInfoおよびGetPublicKeyTokenメソッドがすべて返されるnull
場合は、アセンブリの単純な名前のみが指定されました。 このメソッドは assemblyResolver
、アセンブリ名のすべての部分を使用または無視できます。
単純型名とアセンブリ修飾型名の場合、異なるアセンブリ解決オプションの効果は、[名前解決の混在] セクションにテーブルとして表示されます。
型を解決する
アセンブリ名を指定しない場合 typeName
は、 typeResolver
常に呼び出されます。 アセンブリ名を指定した場合 typeName
は、 typeResolver
アセンブリ名が正常に解決されたときにのみ呼び出されます。 アセンブリプローブが返されたnull
typeResolver
場合assemblyResolver
、または標準アセンブリプローブは呼び出されません。
このメソッドは typeResolver
、次の 3 つの引数を受け取ります。
- 検索するアセンブリ、または
null
アセンブリ名が含まれていない場合typeName
。 - 型の単純な名前。 入れ子になった型の場合、これは最も外側の包含型です。 ジェネリック型の場合、これはジェネリック型の単純な名前です。
- 型名の
true
大文字と小文字が無視される場合のブール値。
実装によって、これらの引数の使用方法が決まります。 このメソッドは typeResolver
、型を解決できない場合に返す null
必要があります。 戻り値が返されたnull
場合、このオーバーロードは TypeLoadExceptionGetType .true
typeResolver
throwOnError
異なる型解決オプションの効果は、単純型名とアセンブリ修飾型名の場合、[名前解決の混在] セクションにテーブルとして表示されます。
入れ子になった型を解決する
入れ子になった型の場合 typeName
は、最も外側の包含型の名前のみが渡されます typeResolver
。 この型を返すと typeResolver
、最も内側の GetNestedType 入れ子になった型が解決されるまで、メソッドが再帰的に呼び出されます。
ジェネリック型を解決する
ジェネリック GetType 型を解決するために再帰的に呼び出されます。最初にジェネリック型自体を解決してから、その型引数を解決します。 型引数がジェネリックの場合は、 GetType 型引数を解決するために再帰的に呼び出されます。
指定する組み合わせは assemblyResolver
、 typeResolver
この再帰のすべてのレベルを解決できる必要があります。 たとえば、読み込みをMyAssembly
制御する値をassemblyResolver
指定するとします。 (Visual Basic の) ジェネリック型Dictionary<string, MyType>
Dictionary(Of String, MyType)
を解決するとします。 次のジェネリック型名を渡すことができます。
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
これが唯一のアセンブリ修飾型引数であることに MyType
注意してください。 およびStringクラスのDictionary<TKey,TValue>名前はアセンブリ修飾されません。 アセンブリtypeResolver
を処理できる必要があります。null
null
Dictionary<TKey,TValue>String 非修飾型名の両方がmscorlib.dll/System.Private.CoreLib.dllにあるため、文字列を受け取るメソッドのオーバーロード GetType を呼び出すことによって、そのケースを処理できます。
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
assemblyResolver
ディクショナリ型と文字列型に対してメソッドが呼び出されないのは、これらの型名がアセンブリ修飾されていないためです。
次に、最初のジェネリック引数の System.String
型が YourType
、次の値から YourAssembly
であるとします。
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
このアセンブリはmscorlib.dll/System.Private.CoreLib.dllでもなく、現在実行中のアセンブリでもないので、アセンブリ修飾名がないと解決 YourType
できません。 再帰的 assemblyResolve
に呼び出されるため、このケースを処理できる必要があります。 それ以外MyAssembly
のアセンブリを返すnull
代わりに、指定されたAssemblyNameオブジェクトを使用してアセンブリの読み込みを実行するようになりました。
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
特殊文字を使用して型名を解決する
アセンブリ修飾名には、特定の文字に特別な意味があります。 単純型名にこれらの文字が含まれている場合、単純名がアセンブリ修飾名の一部である場合、その文字によって解析エラーが発生します。 解析エラーを回避するには、アセンブリ修飾名をメソッドに渡す前に、特殊文字を円記号でエスケープする GetType 必要があります。 たとえば、型に名前が付けられている Strange]Type
場合は、次のように Strange\]Type
角かっこの前にエスケープ文字を追加する必要があります。
Note
このような特殊文字を持つ名前は Visual Basic または C# では作成できませんが、共通の中間言語 (CIL) を使用するか、動的アセンブリを生成することによって作成できます。
次の表に、型名の特殊文字を示します。
文字 | 意味 |
---|---|
, (コンマ) |
アセンブリ修飾名の区切り記号。 |
[] (角かっこ) |
サフィックス ペアとして、配列型を示します。は区切り記号ペアとして、ジェネリック引数リストとアセンブリ修飾名を囲みます。 |
& (アンパサンド) |
サフィックスとして、型が参照型であることを示します。 |
* (アスタリスク) |
サフィックスとして、型がポインター型であることを示します。 |
+ (プラス) |
入れ子になった型の区切り記号。 |
\ (円記号) |
エスケープ文字。 |
正しくエスケープされた文字列を返すなどの AssemblyQualifiedName プロパティ。 正しくエスケープされた文字列をメソッドに渡す GetType 必要があります。 次に、メソッドは GetType 、正しくエスケープされた名前を typeResolver
既定の型解決メソッドに渡します。 名前とエスケープされていない名前 typeResolver
を比較する必要がある場合は、エスケープ文字を削除する必要があります。
名前解決の混在
次の表は、型名とアセンブリ名typeName
のすべての組み合わせに対する 、既定の名前解決の間assemblyResolver
typeResolver
の相互作用をまとめたものです。
型名の内容 | アセンブリ リゾルバー メソッド | 型リゾルバー メソッド | 結果 |
---|---|---|---|
型、アセンブリ | null | null | メソッドのオーバーロードを呼び出すことと Type.GetType(String, Boolean, Boolean) 同じです。 |
型、アセンブリ | 提供の | null | assemblyResolver はアセンブリを返すか、アセンブリを null 解決できない場合は返します。 アセンブリが解決された場合、メソッドオーバーロード Assembly.GetType(String, Boolean, Boolean) はアセンブリから型を読み込むのに使用されます。それ以外の場合は、型を解決しようとしません。 |
型、アセンブリ | null | 提供の | アセンブリ名をオブジェクトに変換し、メソッド オーバーロードを AssemblyName 呼び出してアセンブリを Assembly.Load(AssemblyName) 取得するのと同じです。 アセンブリが解決された場合、アセンブリは ;に typeResolver 渡されます。それ以外の場合は呼び出されず、 typeResolver 型の解決はこれ以上試行されません。 |
型、アセンブリ | 提供の | 提供の | assemblyResolver はアセンブリを返すか、アセンブリを null 解決できない場合は返します。 アセンブリが解決された場合、アセンブリは ;に typeResolver 渡されます。それ以外の場合は呼び出されず、 typeResolver 型の解決はこれ以上試行されません。 |
type | null、指定 | null | メソッドのオーバーロードを呼び出すことと Type.GetType(String, Boolean, Boolean) 同じです。 アセンブリ名が指定されていないため、mscorlib.dll/System.Private.CoreLib.dllと現在実行中のアセンブリのみが検索されます。 指定した場合 assemblyResolver は無視されます。 |
type | null、指定 | 提供の | typeResolver が呼び出され null 、アセンブリに渡されます。 typeResolver は、目的のために読み込むアセンブリを含め、任意のアセンブリから型を提供できます。 指定した場合 assemblyResolver は無視されます。 |
assembly | null、指定 | null、指定 | アセンブリ名がアセンブリ修飾型名であるかのように解析されるため、A FileLoadException がスローされます。 これにより、アセンブリ名が無効になります。 |
.NET