Metody System.Type.GetType
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Pomocí přetížení metody a jejích přidružených přetížení (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) a GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) nahradit výchozí implementaci GetType metody flexibilnějšími implementacemi. Zadáním vlastních metod, které přeloží názvy typů a názvy sestavení, která je obsahují, můžete provést následující:
- Určuje, ze které verze sestavení je typ načten.
- Zadejte jiné místo pro vyhledání názvu typu, který neobsahuje název sestavení.
- Načtěte sestavení pomocí částečných názvů sestavení.
- Vrátí podtřídy System.Type , které nejsou vytvořeny modulem CLR (Common Language Runtime).
Například v serializaci odolné proti verzi tato metoda umožňuje vyhledat sestavení "nejvhodnější" pomocí částečného názvu. Jiné přetížení GetType metody vyžadují název typu kvalifikovaný sestavení, který obsahuje číslo verze.
Alternativní implementace systému typů mohou potřebovat vrátit podtřídy System.Type , které nejsou vytvořeny modulem CLR; všechny typy vrácené jinými přetíženími GetType metody jsou typy modulu runtime.
Poznámky k využití
Tato metoda přetížení a jeho přidružené přetížení parsuje typeName
do názvu typu a název sestavení a pak přeloží názvy. Překlad názvu sestavení nastane před překladem názvu typu, protože název typu musí být přeložen v kontextu sestavení.
Poznámka:
Pokud neznáte koncept názvů typů kvalifikovaných pro sestavení, podívejte se na AssemblyQualifiedName tuto vlastnost.
Pokud typeName
není název kvalifikovaný pro sestavení, překlad sestavení se přeskočí. Nekvalifikované názvy typů lze přeložit v kontextu mscorlib.dll/System.Private.CoreLib.dll nebo aktuálně spuštěného sestavení nebo můžete volitelně zadat sestavení v parametru typeResolver
. Účinky zahrnutí nebo vynechání názvu sestavení pro různé druhy překladu názvů se zobrazí jako tabulka v části Smíšený překlad názvů .
Poznámky k obecnému použití:
Nepředávejte metody
assemblyResolver
nebotypeResolver
pokud pocházejí z neznámých nebo nedůvěryhodných volajících. Používejte pouze metody, které sami poskytnete nebo které znáte.Upozornění
Použití metod od neznámých nebo nedůvěryhodných volajících může vést ke zvýšení oprávnění pro škodlivý kód.
Pokud vynecháte
assemblyResolver
a/nebotypeResolver
parametry, předá se hodnotathrowOnError
parametru metodám, které provádějí výchozí rozlišení.Pokud
throwOnError
jetrue
, tato metoda vyvolá TypeLoadException přitypeResolver
návratunull
a FileNotFoundException kdyžassemblyResolver
vrátínull
.Tato metoda nezachytí výjimky vyvolané
assemblyResolver
atypeResolver
. Zodpovídáte za všechny výjimky vyvolané metodami překladače.
Řešení sestavení
Metoda assemblyResolver
obdrží AssemblyName objekt, který je vytvořen parsováním názvu sestavení řetězce, který je součástí typeName
. Pokud typeName
neobsahuje název sestavení, assemblyResolver
není volána a null
předána do typeResolver
.
Pokud assemblyResolver
není zadán, použije se standardní sondování sestavení k vyhledání sestavení. Pokud assemblyResolver
je k dispozici, metoda neprovádí standardní sondování. V takovém případě je nutné zajistit, aby bylo assemblyResolver
možné zpracovat všechna sestavení, GetType která jí předáte.
Metoda assemblyResolver
by se měla vrátit null
, pokud sestavení nelze přeložit. Pokud assemblyResolver
se vrátí null
, typeResolver
není volána a nedojde k žádnému dalšímu zpracování; pokud throwOnError
je true
, FileNotFoundException je vyvolána.
Je-li AssemblyName předána assemblyResolver
je částečný název, jeden nebo více jeho částí jsou null
. Pokud například nemá žádnou verzi, Version vlastnost je null
. Version Pokud vlastnost, CultureInfo vlastnost a GetPublicKeyToken metoda všechny vrátit null
, pak byl zadán pouze jednoduchý název sestavení. Metoda assemblyResolver
může použít nebo ignorovat všechny části názvu sestavení.
Efekty různých možností rozlišení sestavení se zobrazí jako tabulka v oddílu překladu smíšených názvů pro jednoduché a sestavení kvalifikované názvy typů.
Řešení typů
Pokud typeName
nezadáte název sestavení, typeResolver
je vždy volána. Pokud typeName
určuje název sestavení, je volána pouze v případě, typeResolver
že se název sestavení úspěšně přeloží. Pokud assemblyResolver
nebo standardní sestavení probing vrátí null
, typeResolver
není volána.
Metoda typeResolver
přijímá tři argumenty:
- Sestavení, které chcete vyhledat nebo
null
pokudtypeName
neobsahuje název sestavení. - Jednoduchý název typu. V případě vnořeného typu se jedná o nejkrajnější typ obsahující typ. V případě obecného typu je to jednoduchý název obecného typu.
- Logická hodnota, která je v
true
případě, že se má ignorovat velká a malá písmena názvů typů.
Implementace určuje způsob použití těchto argumentů. Metoda typeResolver
by se měla vrátit null
, pokud nemůže přeložit typ. Pokud typeResolver
se vrátí null
a throwOnError
je true
, toto přetížení GetType vyvolá TypeLoadException.
Efekty různých možností rozlišení typů se zobrazí jako tabulka v části překladu smíšených názvů pro jednoduché a sestavení kvalifikované názvy typů.
Řešení vnořených typů
Je-li typeName
vnořený typ, předá typeResolver
se pouze název vnějšího typu obsahujícího typ . Pokud typeResolver
vrátí tento typ, metoda se nazývá rekurzivně, GetNestedType dokud nebude vyřešen nejvíce vnořený typ.
Řešení obecných typů
Označuje se GetType rekurzivně k vyřešení obecných typů: Nejprve přeložíte samotný obecný typ a pak přeložíte argumenty typu. Pokud je argument typu obecný, GetType nazývá se rekurzivně k vyřešení argumentů typu atd.
Kombinace assemblyResolver
a typeResolver
že poskytujete, musí být schopna vyřešit všechny úrovně této rekurze. Předpokládejme například, že zadáte assemblyResolver
, který řídí načítání MyAssembly
. Předpokládejme, že chcete vyřešit obecný typ Dictionary<string, MyType>
(Dictionary(Of String, MyType)
v jazyce Visual Basic). Můžete předat následující obecný název typu:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Všimněte si, že MyType
je jediným argumentem typu kvalifikovaného sestavení. Názvy Dictionary<TKey,TValue> tříd a String názvů nejsou kvalifikované pro sestavení. Musí typeResolver
být schopen zpracovat buď sestavení, nebo null
, protože bude přijímat null
pro Dictionary<TKey,TValue> a String. Tento případ lze zpracovat voláním přetížení GetType metody, která přebírá řetězec, protože oba nekvalifikované názvy typů jsou v mscorlib.dll/System.Private.CoreLib.dll:
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))
Metoda assemblyResolver
není volána pro typ slovníku a typ řetězce, protože tyto názvy typů nejsou kvalifikované pro sestavení.
Nyní předpokládejme, že místo System.String
, první obecný typ argumentu je YourType
z YourAssembly
:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Vzhledem k tomu, že toto sestavení není mscorlib.dll/System.Private.CoreLib.dll ani aktuálně spuštěné sestavení, nelze přeložit YourType
bez názvu kvalifikovaného sestavení. Vzhledem k tomu, že vaše assemblyResolve
bude volána rekurzivně, musí být schopná tento případ zpracovat. Místo vrácení null
pro jiná sestavení než MyAssembly
, nyní provádí načtení sestavení pomocí zadaného AssemblyName objektu.
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)
Překlad názvů typů se speciálními znaky
Některé znaky mají speciální významy v názvech kvalifikovaných pro sestavení. Pokud název jednoduchého typu obsahuje tyto znaky, způsobí znaky chyby analýzy, pokud je jednoduchý název součástí názvu kvalifikovaného sestavení. Abyste se vyhnuli chybám analýzy, musíte před předáním kvalifikovaného názvu GetType sestavení metodě utéct speciální znaky zpětným lomítkem. Pokud je například typ pojmenován Strange]Type
, musí být řídicí znak přidán před hranaté závorky následujícím způsobem: Strange\]Type
.
Poznámka:
Názvy s těmito speciálními znaky nelze vytvořit v jazyce Visual Basic nebo C#, ale lze je vytvořit pomocí společného zprostředkujícího jazyka (CIL) nebo generováním dynamických sestavení.
Následující tabulka uvádí speciální znaky pro názvy typů.
Znak | Význam |
---|---|
, (čárka) |
Oddělovač pro názvy kvalifikované pro sestavení. |
[] (hranaté závorky) |
Jako dvojici přípon označuje typ pole; Jako dvojici oddělovače uzavřete obecné seznamy argumentů a kvalifikované názvy sestavení. |
& (ampersand) |
Jako přípona označuje, že typ je odkazový typ. |
* (hvězdička) |
Jako přípona označuje, že typ je typ ukazatele. |
+ (plus) |
Oddělovač pro vnořené typy |
\ (zpětné lomítko) |
Řídicí znak. |
Vlastnosti, jako AssemblyQualifiedName je například vrácení správných řídicích řetězců. Metodě musíte předat správně uchvácené GetType řetězce. Metoda pak GetType předává správně uchycené názvy do typeResolver
a do výchozích metod překladu typů. Pokud potřebujete porovnat název s nepoupraveným názvem, typeResolver
musíte řídicí znaky odebrat.
Smíšený překlad názvů
Následující tabulka shrnuje interakce mezi assemblyResolver
a typeResolver
výchozím překladem názvů pro všechny kombinace názvu typu a názvu sestavení v typeName
:
Obsah názvu typu | Metoda překladače sestavení | Metoda překladače typů | Výsledek |
---|---|---|---|
typ, sestavení | null | null | Ekvivalent volání Type.GetType(String, Boolean, Boolean) přetížení metody. |
typ, sestavení | k dispozici | null | assemblyResolver vrátí sestavení nebo vrátí null , pokud nemůže přeložit sestavení. Pokud je sestavení vyřešeno, Assembly.GetType(String, Boolean, Boolean) přetížení metody se používá k načtení typu ze sestavení; jinak se žádný pokus o vyřešení typu. |
typ, sestavení | null | k dispozici | Ekvivalentní převodu názvu sestavení na AssemblyName objekt a volání Assembly.Load(AssemblyName) přetížení metody získat sestavení. Pokud je sestavení vyřešeno, předá typeResolver se ; jinak typeResolver není volána a neexistuje další pokus o vyřešení typu. |
typ, sestavení | k dispozici | k dispozici | assemblyResolver vrátí sestavení nebo vrátí null , pokud nemůže přeložit sestavení. Pokud je sestavení vyřešeno, předá typeResolver se ; jinak typeResolver není volána a neexistuje další pokus o vyřešení typu. |
type | null, k dispozici | null | Ekvivalent volání Type.GetType(String, Boolean, Boolean) přetížení metody. Protože název sestavení není zadaný, prohledávají se pouze mscorlib.dll/System.Private.CoreLib.dll a aktuálně spuštěné sestavení. Pokud assemblyResolver je zadaný, bude ignorován. |
type | null, k dispozici | k dispozici | typeResolver je volána a null je předána pro sestavení. typeResolver může poskytnout typ z libovolného sestavení, včetně sestavení, která za tímto účelem načte. Pokud assemblyResolver je zadaný, bude ignorován. |
sestavení | null, k dispozici | null, k dispozici | Vyvolá se odpověď FileLoadException , protože název sestavení je analyzován, jako by se jednalo o název typu kvalifikovaného sestavení. Výsledkem je neplatný název sestavení. |