Sdílet prostřednictvím


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 nebo typeResolver 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/nebo typeResolver parametry, předá se hodnota throwOnError parametru metodám, které provádějí výchozí rozlišení.

  • Pokud throwOnError je true, tato metoda vyvolá TypeLoadException při typeResolver návratu nulla FileNotFoundException když assemblyResolver vrátí null.

  • Tato metoda nezachytí výjimky vyvolané assemblyResolver a typeResolver. 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 pokud typeName 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á typeResolverse 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 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)

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, typeResolvermusíte řídicí znaky odebrat.

Smíšený překlad 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í 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á typeResolverse ; 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á typeResolverse ; 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í.