Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í:
- Ovládejte, 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 u serializace odolné vůči verzím tato metoda umožňuje vyhledat "nejlepší možné" sestavení pomocí částečného názvu. Jiná přetížení metody GetType vyžadují sestavením kvalifikovaný název typu, který zahrnuje čí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 na název typu a název sestavení a poté tyto názvy vyřeší. Vyřešení názvu sestavení dochází před vyřešením názvu typu, protože název typu musí být vyřešen v rámci 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 vyřešit v kontextu mscorlib.dll/System.Private.CoreLib.dll nebo aktuálně běžící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
assemblyResolvernebotypeResolver, pokud pocházejí z neznámých nebo nedůvěryhodných volajících. Používejte pouze metody, které poskytujete 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
assemblyResolvera/nebotypeResolverparametry, předá se hodnotathrowOnErrorparametru metodám, které provádějí výchozí rozlišení.Pokud
throwOnErrorjetrue, tato metoda vyvolá TypeLoadException přitypeResolvernávratunulla FileNotFoundException kdyžassemblyResolvervrátínull.Tato metoda nezachytí výjimky vyvolané
assemblyResolveratypeResolver. Zodpovídáte za všechny výjimky vyvolané metodami překladače.
Vyř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 je assemblyResolver k dispozici, metoda GetType neprovádí standardní sondování; v takovém případě musíte zajistit, aby vaše assemblyResolver mohlo zpracovat všechna sestavení, která mu předáte.
Metoda assemblyResolver by měla vrátit null, pokud sestavení nelze vyřešit. Pokud assemblyResolver vrátí null, volání typeResolver se neprovede a nedojde k dalšímu zpracování; pokud throwOnError je true, FileNotFoundException se vyhodí.
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. Pokud Version vlastnost, CultureInfo vlastnost a GetPublicKeyToken metoda všechny vracejí null, pak byl zadán pouze jednoduchý název sestavení. Metoda assemblyResolver může použít nebo ignorovat všechny části názvu sestavení.
Účinky různých možností rozlišení sestavení jsou zobrazeny jako tabulka v oddílu Rozlišení smíšených názvů pro jednoduché a s typy pojmenovanými pomocí kvalifikace sestavení.
Řešení typů
Pokud typeName nezadá název sestavení, typeResolver je vždy voláno. Pokud typeName určuje název sestavení, typeResolver je volána pouze tehdy, když je název sestavení úspěšně rozpoznán. Pokud assemblyResolver nebo standardní sestavení zjišťování vrátí null, typeResolver není voláno.
Metoda typeResolver přijímá tři argumenty:
- Sestavení, které chcete vyhledat nebo
nullpokudtypeNameneobsahuje název sestavení. - Jednoduchý název typu. V případě vnořeného typu se jedná o vnější obalující typ. V případě obecného typu je to jednoduchý název obecného typu.
- Logická hodnota, která je v
truepří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 měla vrátit null, pokud nemůže určit typ. Pokud typeResolver se vrátí null a throwOnError je true, toto přetížení GetType vyvolá TypeLoadException.
Účinky různých možností rozlišení názvů se zobrazí jako tabulka v části Smíšené rozlišení názvů pro jednoduché názvy typů a názvy typů kvalifikované sestavou.
Řešení vnořených typů
Je-li typeName vnořený typ, do typeResolver se předá pouze název nějvyššího vnějšího typu. Pokud typeResolver vrátí tento typ, metoda GetNestedType se volá rekurzivně, dokud nebude vyřešen nejvíce vnořený typ.
Řešení obecných typů
GetType je volána rekurzivně k vyřešení generických typů: Nejprve je vyřešen samotný generický typ a pak jsou vyřešeny jeho argumenty typu. Pokud je argument typu obecný, GetType volá se rekurzivně pro vyřešení argumentů typu, a tak dále.
Kombinace assemblyResolver a typeResolver, kterou poskytnete, 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í název obecného typu:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Všimněte si, že MyType je jediným typovým argumentem kvalifikovaným sestavením. Názvy tříd Dictionary<TKey,TValue> a String nejsou plně kvalifikované pro sestavení. Vaše typeResolver musí být schopna 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í metody GetType, která přijímá řetězec, protože obě nekvalifikovaná jména 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 YourTypez 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)
Vyřešení 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ůsobují chyby při analýze, 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 escape znak přidán před hranatou závorku 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č názvů kvalifikovaných pro shromáždění. |
[] (hranaté závorky) |
Jako dvojice přípon označuje typ pole; jako dvojice oddělovačů uzavírá obecné seznamy argumentů a názvy sestavení s kvalifikací. |
| 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 je AssemblyQualifiedName, vracejí správně escapované řetězce. Metodě musíte předat správně uchvácené GetType řetězce. Metoda GetType pak předává správně upravené názvy do typeResolver a do výchozích metod řešení typů. Pokud potřebujete porovnat název s nepoupraveným názvem, typeResolvermusíte řídicí znaky odebrat.
Smíšené rozlišení názvů
Následující tabulka shrnuje interakce mezi assemblyResolvera typeResolvervý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í | nula | nula | Ekvivalent volání metody s přetížením Type.GetType(String, Boolean, Boolean). |
| typ, sestavení | poskytnutý | nula |
assemblyResolver vrátí sestavení nebo vrátí null , pokud nemůže vyřešit sestavení. Pokud je sestavení vyřešeno, přetížená metoda Assembly.GetType(String, Boolean, Boolean) se používá k načtení typu ze sestavení; jinak se neprovádí pokus o vyřešení typu. |
| typ, sestavení | nula | poskytnutý | 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á se typeResolver; jinak není volána typeResolver a nebude podniknut další pokus o vyřešení typu. |
| typ, sestavení | poskytnutý | poskytnutý |
assemblyResolver vrátí sestavení nebo vrátí null , pokud nemůže vyřešit sestavení. Pokud je sestavení vyřešeno, předá se typeResolver; jinak není volána typeResolver a nebude podniknut další pokus o vyřešení typu. |
| typ | null, poskytnuto | nula | Ekvivalent volání metody s přetížením Type.GetType(String, Boolean, Boolean). 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. |
| typ | null, poskytnuto | poskytnutý |
typeResolver je volán a null je předán pro sestavení.
typeResolver může poskytnout typ z jakéhokoli sestavení, včetně sestavení, která za tímto účelem načte. Pokud assemblyResolver je zadaný, bude ignorován. |
| montáž | null, poskytnuto | null, poskytnuto | 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í. |