次の方法で共有


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 is true, this method throws a TypeLoadException when typeResolver returns null, and a FileNotFoundException when assemblyResolver returns null.

  • このメソッドは、and によってスローされた例外をassemblyResolvertypeResolverキャッチしません。 リゾルバー メソッドによってスローされる例外については、ユーザーが責任を負います。

アセンブリを解決する

このメソッドは assemblyResolver オブジェクトを AssemblyName 受け取ります。オブジェクトは、に含まれる typeName文字列アセンブリ名を解析することによって生成されます。 アセンブリ名が含まれていない場合 typeName は、 assemblyResolver 呼び出 null されずに typeResolver渡されます。

指定しない場合 assemblyResolver は、標準アセンブリプローブを使用してアセンブリを検索します。 指定した場合 assemblyResolverGetType メソッドは標準のプローブを実行しません。その場合は、渡すすべてのアセンブリを確実に処理できるようにする必要があります assemblyResolver

アセンブリを assemblyResolver 解決できない場合は、メソッドが返されます null 。 戻り値nullが返された場合assemblyResolvertypeResolver呼び出されず、それ以上の処理は行われません。さらに、ある場合throwOnErrortrue、a FileNotFoundException がスローされます。

AssemblyName渡されるassemblyResolver部分名が部分名の場合、その部分の 1 つ以上は null. たとえば、バージョンがない場合、 Version プロパティは null. Versionプロパティ、プロパティ、CultureInfoおよびGetPublicKeyTokenメソッドがすべて返されるnull場合は、アセンブリの単純な名前のみが指定されました。 このメソッドは assemblyResolver 、アセンブリ名のすべての部分を使用または無視できます。

単純型名とアセンブリ修飾型名の場合、異なるアセンブリ解決オプションの効果は、[名前解決の混在] セクションにテーブルとして表示されます。

型を解決する

アセンブリ名を指定しない場合 typeName は、 typeResolver 常に呼び出されます。 アセンブリ名を指定した場合 typeName は、 typeResolver アセンブリ名が正常に解決されたときにのみ呼び出されます。 アセンブリプローブが返されたnulltypeResolver場合assemblyResolver、または標準アセンブリプローブは呼び出されません。

このメソッドは typeResolver 、次の 3 つの引数を受け取ります。

  • 検索するアセンブリ、または null アセンブリ名が含まれていない場合 typeName
  • 型の単純な名前。 入れ子になった型の場合、これは最も外側の包含型です。 ジェネリック型の場合、これはジェネリック型の単純な名前です。
  • 型名の true 大文字と小文字が無視される場合のブール値。

実装によって、これらの引数の使用方法が決まります。 このメソッドは typeResolver 、型を解決できない場合に返す null 必要があります。 戻り値が返されたnull場合、このオーバーロードは TypeLoadExceptionGetType .truetypeResolverthrowOnError

異なる型解決オプションの効果は、単純型名とアセンブリ修飾型名の場合、[名前解決の混在] セクションにテーブルとして表示されます。

入れ子になった型を解決する

入れ子になった型の場合 typeName は、最も外側の包含型の名前のみが渡されます typeResolver。 この型を返すと typeResolver 、最も内側の GetNestedType 入れ子になった型が解決されるまで、メソッドが再帰的に呼び出されます。

ジェネリック型を解決する

ジェネリック GetType 型を解決するために再帰的に呼び出されます。最初にジェネリック型自体を解決してから、その型引数を解決します。 型引数がジェネリックの場合は、 GetType 型引数を解決するために再帰的に呼び出されます。

指定する組み合わせは assemblyResolvertypeResolver この再帰のすべてのレベルを解決できる必要があります。 たとえば、読み込みを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を処理できる必要があります。nullnullDictionary<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のすべての組み合わせに対する 、既定の名前解決の間assemblyResolvertypeResolverの相互作用をまとめたものです。

型名の内容 アセンブリ リゾルバー メソッド 型リゾルバー メソッド 結果
型、アセンブリ 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 がスローされます。 これにより、アセンブリ名が無効になります。