System.Type.GetType-Methoden
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Verwenden Sie die GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Methodenüberladung und die damit verbundenen Überladungen (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) und GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) um die Standardimplementierung der GetType Methode durch flexiblere Implementierungen zu ersetzen. Indem Sie eigene Methoden bereitstellen, mit denen Typnamen und die Namen der Assemblys aufgelöst werden, die sie enthalten, können Sie die folgenden Aktionen ausführen:
- Steuern Sie, aus welcher Version einer Assembly ein Typ geladen wird.
- Geben Sie einen anderen Ort an, um nach einem Typnamen zu suchen, der keinen Assemblynamen enthält.
- Laden Von Assemblys mit partiellen Assemblynamen.
- Gibt Unterklassen zurück, die System.Type nicht von der Common Language Runtime (CLR) erstellt werden.
In der versionstoleranten Serialisierung können Sie z. B. mithilfe eines Teilnamens nach einer "am besten geeigneten" Assembly suchen. Andere Überladungen der GetType Methode erfordern einen assemblyqualifizierten Typnamen, der die Versionsnummer enthält.
Alternative Implementierungen des Typsystems müssen möglicherweise Unterklassen zurückgeben, die System.Type nicht vom CLR erstellt werden. Alle Typen, die von anderen Überladungen der GetType Methode zurückgegeben werden, sind Laufzeittypen.
Hinweise zur Verwendung
Diese Methodenüberladung und die zugehörigen Überladungen analysieren typeName
den Namen eines Typs und den Namen einer Assembly, und lösen Sie dann die Namen auf. Die Auflösung des Assemblynamens erfolgt vor der Auflösung des Typnamens, da ein Typname im Kontext einer Assembly aufgelöst werden muss.
Hinweis
Wenn Sie mit dem Konzept von assemblyqualifizierten Typnamen nicht vertraut sind, lesen Sie die AssemblyQualifiedName Eigenschaft.
Wenn typeName
es sich nicht um einen assemblyqualifizierten Namen handelt, wird die Assemblyauflösung übersprungen. Nicht qualifizierte Typnamen können im Kontext von mscorlib.dll/System.Private.CoreLib.dll oder der derzeit ausgeführten Assembly aufgelöst werden, oder Sie können optional eine Assembly im typeResolver
Parameter bereitstellen. Die Auswirkungen des Einschließens oder Weglassens des Assemblynamens für verschiedene Arten der Namensauflösung werden als Tabelle im Abschnitt "Gemischte Namensauflösung " angezeigt.
Allgemeine Nutzungshinweise:
Übergeben Sie keine Methoden an
assemblyResolver
odertypeResolver
wenn sie von unbekannten oder nicht vertrauenswürdigen Aufrufen stammen. Verwenden Sie nur Methoden, die Sie bereitstellen oder mit denen Sie vertraut sind.Achtung
Die Verwendung von Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufen kann zu einer Erhöhung der Rechte für bösartigen Code führen.
Wenn Sie die
assemblyResolver
Und/odertypeResolver
Parameter weglassen, wird der Wert desthrowOnError
Parameters an die Methoden übergeben, die die Standardauflösung ausführen.Wenn
throwOnError
dies der Fall isttrue
, löst diese Methode ein TypeLoadException , wenntypeResolver
zurückgegebennull
wird, und ein FileNotFoundException , wennassemblyResolver
zurückgegebennull
wird.Mit dieser Methode werden keine Ausnahmen erfasst, die von
assemblyResolver
undtypeResolver
. Sie sind für alle Ausnahmen verantwortlich, die von den Resolver-Methoden ausgelöst werden.
Auflösen von Assemblys
Die assemblyResolver
Methode empfängt ein AssemblyName Objekt, das durch analysieren des Zeichenfolgenassemblynamens erzeugt wird, der in typeName
enthalten ist. Wenn typeName
kein Assemblyname enthalten ist, assemblyResolver
wird er nicht aufgerufen und null
an typeResolver
.
Wenn assemblyResolver
nicht angegeben, wird die Standardassembly-Probing verwendet, um die Assembly zu finden. Wenn assemblyResolver
die Methode bereitgestellt wird, führt die GetType Methode keine Standardmäßige Überprüfung durch. In diesem Fall müssen Sie sicherstellen, dass alle assemblyResolver
Assemblys verarbeitet werden können, die Sie an sie übergeben.
Die assemblyResolver
Methode sollte zurückgegeben null
werden, wenn die Assembly nicht aufgelöst werden kann. Wenn assemblyResolver
zurückgegeben null
wird , typeResolver
wird nicht aufgerufen, und es erfolgt keine weitere Verarbeitung, wenn throwOnError
dies der Fall ist true
, wird eine FileNotFoundException ausgelöst.
Wenn das AssemblyName übergeben assemblyResolver
wird, ist ein Teilname, eine oder mehrere teile sind null
. Wenn sie z. B. keine Version aufweist, lautet null
die Version Eigenschaft . Wenn die Version Eigenschaft, die CultureInfo Eigenschaft und die GetPublicKeyToken Methode alle zurückgegeben null
werden, wurde nur der einfache Name der Assembly angegeben. Die assemblyResolver
Methode kann alle Teile des Assemblynamens verwenden oder ignorieren.
Die Effekte verschiedener Assemblyauflösungsoptionen werden als Tabelle im Abschnitt "Gemischte Namensauflösung " für einfache und assemblyqualifizierte Typennamen angezeigt.
Auflösen von Typen
Wenn typeName
kein Assemblyname angegeben wird, typeResolver
wird immer aufgerufen. Wenn typeName
ein Assemblyname angegeben wird, wird nur aufgerufen, typeResolver
wenn der Assemblyname erfolgreich aufgelöst wird. Wenn assemblyResolver
oder Die Standardassembly-Probing zurückgegeben null
wird, typeResolver
wird nicht aufgerufen.
Die typeResolver
Methode empfängt drei Argumente:
- Die zu durchsuchende Assembly oder
null
wenntypeName
sie keinen Assemblynamen enthält. - Der einfache Name des Typs. Bei einem geschachtelten Typ ist dies der äußerste enthaltende Typ. Im Fall eines generischen Typs ist dies der einfache Name des generischen Typs.
- Ein boolescher Wert, der angibt,
true
ob die Groß-/Kleinschreibung von Typnamen ignoriert werden soll.
Die Implementierung bestimmt, wie diese Argumente verwendet werden. Die typeResolver
Methode sollte zurückgegeben werden null
, wenn der Typ nicht aufgelöst werden kann. Wenn typeResolver
diese null
Überladung zurückgegeben wird und throwOnError
ist true
, löst diese Überladung ein GetTypeTypeLoadException.
Die Effekte verschiedener Typenauflösungsoptionen werden als Tabelle im Abschnitt "Gemischte Namensauflösung " für einfache und assemblyqualifizierte Typennamen angezeigt.
Auflösen geschachtelter Typen
Wenn typeName
es sich um einen geschachtelten Typ handelt, wird nur der Name des äußersten typs übergeben.typeResolver
Wenn typeResolver
dieser Typ zurückgegeben wird, wird die GetNestedType Methode rekursiv aufgerufen, bis der innerste geschachtelte Typ aufgelöst wurde.
Auflösen generischer Typen
Dies GetType wird rekursiv aufgerufen, um generische Typen aufzulösen: Zuerst zum Auflösen des generischen Typs selbst und dann zum Auflösen der Typargumente. Wenn ein Typargument generisch ist, wird rekursiv aufgerufen, GetType um die Typargumente aufzulösen usw.
Die Kombination von assemblyResolver
und typeResolver
der bereitstellung muss in der Lage sein, alle Ebenen dieser Rekursion aufzulösen. Angenommen, Sie geben eine assemblyResolver
, die das Laden von MyAssembly
. Angenommen, Sie möchten den generischen Typ Dictionary<string, MyType>
auflösen (Dictionary(Of String, MyType)
in Visual Basic). Möglicherweise übergeben Sie den folgenden generischen Typnamen:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Beachten Sie, dass es sich MyType
um das einzige assemblyqualifizierte Typargument handelt. Die Namen und Dictionary<TKey,TValue>String Klassen sind nicht assemblyfähig. Sie typeResolver
müssen in der Lage sein, entweder eine Assembly oder null
, da sie empfangen null
wird und Dictionary<TKey,TValue>String. Es kann diesen Fall behandeln, indem eine Überladung der Methode aufgerufen wird, die GetType eine Zeichenfolge akzeptiert, da sich beide nicht qualifizierten Typnamen in mscorlib.dll/System.Private.CoreLib.dll befinden:
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))
Die assemblyResolver
Methode wird nicht für den Wörterbuchtyp und den Zeichenfolgentyp aufgerufen, da diese Typnamen nicht assemblyfähig sind.
Angenommen, anstelle des System.String
ersten generischen Argumenttyps lautet YourType
:YourAssembly
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Da diese Assembly weder mscorlib.dll/System.Private.CoreLib.dll noch die derzeit ausgeführte Assembly ist, können Sie ohne assemblyqualifizierten Namen nicht auflösen YourType
. Da Ihr assemblyResolve
Vorgang rekursiv aufgerufen wird, muss er in der Lage sein, diesen Fall zu behandeln. null
Statt für andere Assemblys als MyAssembly
,, es führt jetzt eine Assemblylast mithilfe des angegebenen AssemblyName Objekts aus.
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)
Auflösen von Typnamen mit Sonderzeichen
Bestimmte Zeichen haben besondere Bedeutungen in assemblyqualifizierten Namen. Wenn ein einfacher Typname diese Zeichen enthält, verursachen die Zeichen Analysefehler, wenn der einfache Name Teil eines assemblyqualifizierten Namens ist. Um die Analysefehler zu vermeiden, müssen Sie die Sonderzeichen mit einem umgekehrten Schrägstrich escapen, bevor Sie den assemblyqualifizierten Namen an die GetType Methode übergeben können. Wenn beispielsweise ein Typ benannt Strange]Type
ist, muss das Escapezeichen vor der eckigen Klammer wie folgt hinzugefügt werden: Strange\]Type
Hinweis
Namen mit solchen Sonderzeichen können in Visual Basic oder C# nicht erstellt werden, können aber mithilfe allgemeiner Zwischensprache (CIL) oder durch Senden dynamischer Assemblys erstellt werden.
In der folgenden Tabelle sind die Sonderzeichen für Typnamen aufgeführt.
Zeichen | Bedeutung |
---|---|
, (Komma) |
Trennzeichen für assemblyqualifizierte Namen. |
[] (eckige Klammern) |
Gibt als Suffixpaar einen Arraytyp an; als Trennzeichenpaar schließt generische Argumentlisten und assemblyqualifizierte Namen ein. |
& (kaufmännisches Und-Zeichen) |
Gibt als Suffix an, dass ein Typ ein Verweistyp ist. |
* (Sternchen) |
Gibt als Suffix an, dass ein Typ ein Zeigertyp ist. |
+ (plus) |
Trennzeichen für geschachtelte Typen. |
\ (umgekehrter Schrägstrich) |
Escapezeichen. |
Eigenschaften wie AssemblyQualifiedName das Zurückgeben korrekter Escapezeichenfolgen. Sie müssen an die GetType Methode ordnungsgemäß escapede Zeichenfolgen übergeben. Die Methode übergibt wiederum GetType ordnungsgemäß Escapenamen an typeResolver
und an die Standardmethoden für die Typauflösung. Wenn Sie einen Namen mit einem nicht gescapeten Namen typeResolver
vergleichen müssen, müssen Sie die Escapezeichen entfernen.
Auflösung gemischter Namen
In der folgenden Tabelle werden die Interaktionen zwischen assemblyResolver
, , typeResolver
und der Standardnamenauflösung für alle Kombinationen von Typname und Assemblyname in typeName
:
Inhalt des Typnamens | Assembly-Resolver-Methode | Type Resolver-Methode | Ergebnis |
---|---|---|---|
Typ, Assembly | NULL | NULL | Entspricht dem Aufrufen der Type.GetType(String, Boolean, Boolean) Methodenüberladung. |
Typ, Assembly | bereitgestellter | NULL | assemblyResolver gibt die Assembly zurück oder gibt zurück null , wenn sie die Assembly nicht auflösen kann. Wenn die Assembly aufgelöst wird, wird die Assembly.GetType(String, Boolean, Boolean) Methodenüberladung verwendet, um den Typ aus der Assembly zu laden. Andernfalls wird kein Versuch unternommen, den Typ aufzulösen. |
Typ, Assembly | NULL | bereitgestellter | Entspricht dem Konvertieren des Assemblynamens in ein AssemblyName Objekt und aufrufen der Assembly.Load(AssemblyName) Methodenüberladung zum Abrufen der Assembly. Wenn die Assembly aufgelöst wird, wird sie an ; typeResolver andernfalls wird sie nicht aufgerufen, und es wird kein weiterer Versuch unternommen, typeResolver den Typ aufzulösen. |
Typ, Assembly | bereitgestellter | bereitgestellter | assemblyResolver gibt die Assembly zurück oder gibt zurück null , wenn sie die Assembly nicht auflösen kann. Wenn die Assembly aufgelöst wird, wird sie an ; typeResolver andernfalls wird sie nicht aufgerufen, und es wird kein weiterer Versuch unternommen, typeResolver den Typ aufzulösen. |
Typ | null, bereitgestellt | NULL | Entspricht dem Aufrufen der Type.GetType(String, Boolean, Boolean) Methodenüberladung. Da der Assemblyname nicht angegeben wird, werden nur mscorlib.dll/System.Private.CoreLib.dll und die derzeit ausgeführte Assembly durchsucht. Wenn assemblyResolver angegeben, wird sie ignoriert. |
Typ | null, bereitgestellt | bereitgestellter | typeResolver wird aufgerufen und null für die Assembly übergeben. typeResolver kann einen Typ aus jeder Assembly bereitstellen, einschließlich Assemblys, die es für den Zweck lädt. Wenn assemblyResolver angegeben, wird sie ignoriert. |
assembly | null, bereitgestellt | null, bereitgestellt | Ein FileLoadException Fehler wird ausgelöst, da der Assemblyname analysiert wird, als ob es sich um einen assemblyqualifizierten Typnamen handelt. Dies führt zu einem ungültigen Assemblynamen. |