System.Type.GetType metódusok

Megjegyzés:

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

Használja a GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metódus túlterhelését és a hozzá tartozó túlterheléseket (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) és GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) a GetType módszer alapértelmezett implementációjának rugalmasabb implementációkra való lecseréléséhez. A típusneveket és az azokat tartalmazó szerelvények nevét feloldó saját metódusok megadásával a következőket teheti:

  • Szabályozza, hogy egy típust egy összeállítás melyik verziójából töltsön be.
  • Adjon meg egy másik helyet egy olyan típusnév kereséséhez, amely nem tartalmaz szerelvénynevet.
  • Szerelvények betöltése részleges szerelvénynevek használatával.
  • Olyan alosztályokat System.Type ad vissza, amelyeket nem a közös nyelvi futtatókörnyezet (CLR) hoz létre.

A verziótűrő szerializációban például ez a módszer lehetővé teszi, hogy részleges névvel keressen egy "legjobban illeszkedő" szerelvényt. A metódus egyéb túlterheléseihez GetType szerelvény-minősített típusnévre van szükség, amely tartalmazza a verziószámot.

Előfordulhat, hogy a típusrendszer alternatív implementációinak vissza kell adniuk olyan alosztályokat a System.Type, amelyeket nem a CLR hozott létre; a GetType metódus egyéb túlterhelései által visszaadott összes típus futásidejű típus.

Használati megjegyzések

Ennek a metódusnak a túlterhelés, illetve az ezekhez tartozó túlterhelések typeName egy típus és egy szerelvény nevekké való elemzésével, majd a nevek feloldásával oldják meg a feladatot. A szerelvény nevének feloldása a típusnév feloldása előtt történik, mivel egy típusnevet egy szerelvény kontextusában kell feloldani.

Megjegyzés:

Ha nem ismeri az assembly által minősített típusnevek fogalmát, olvassa el a következő részt: AssemblyQualifiedName.

Ha a typeName nem egy szerelvénykompatibilis név, a szerelvény feloldása elmarad. A nem minősített típusnevek feloldhatók a mscorlib.dll/System.Private.CoreLib.dll vagy az éppen futó szerelvény kontextusában, vagy megadhat egy szerelvényt a typeResolver paraméterben. A szerelvény nevének különböző típusú névfeloldáshoz való beleadásának vagy kihagyásának hatásai táblázatként jelennek meg a Vegyes névfeloldás szakaszban.

Általános használati megjegyzések:

  • Ne adja át a metódusokat a assemblyResolver vagy a typeResolver-nek, ha azok ismeretlen vagy nem megbízható hívóktól származnak. Csak az Ön által megadott vagy már ismert metódusokat használja.

    Figyelmeztetés

    Ha ismeretlen vagy nem megbízható hívóktól származó metódusokat használ, az a rosszindulatú kódok jogosultságának emelkedését eredményezheti.

  • Ha kihagyja a assemblyResolver és/vagy a typeResolver paramétereket, a throwOnError paraméter értéke az alapértelmezett felbontást végrehajtó metódusoknak lesz átadva.

  • Ha throwOnErrortrue, ez a metódus TypeLoadException-t dob, amikor typeResolvernull értéket ad vissza, és FileNotFoundException-t, amikor assemblyResolvernull értéket ad vissza.

  • Ez a módszer nem észleli az assemblyResolver és typeResolver által dobott kivételeket. Ön a felelős minden olyan kivételért, amelyet a feloldó metódusok okoznak.

Szerelvények feloldása

A assemblyResolver metódus kap egy AssemblyName objektumot, amely a sztringszerelvény nevének typeNameelemzésével jön létre. Ha a typeName nem tartalmaz egy névjegyzéket, akkor a assemblyResolver nem hívódik meg, és a null átadódik a typeResolver-nak.

Ha assemblyResolver nincs megadva, a rendszer szabványos szerelvény-próbat használ a szerelvény megkereséséhez. Ha assemblyResolver meg van adva, a GetType metódus nem végez szokásos vizsgálatot; ebben az esetben gondoskodnia kell arról, hogy a assemblyResolver kezelni tudja a kapott szerelvényeket.

A assemblyResolver metódusnak vissza kell térnie null , ha a szerelvény nem oldható fel. Ha assemblyResolver visszaadja null, akkor typeResolver nem kerül meghívásra, és nem történik további feldolgozás; továbbá, ha throwOnErrortrue, akkor egy FileNotFoundException kivétel kerül dobásra.

Ha az AssemblyName átadott assemblyResolver név egy részleges név, akkor annak egy vagy több része a következő null. Ha például nem rendelkezik verzióval, akkor a tulajdonság .Versionnull Ha a Version tulajdonság, a CultureInfo tulajdonság és a GetPublicKeyToken metódus mind visszaadja null, akkor csak a szerelvény egyszerű neve lett megadva. A assemblyResolver metódus a szerelvény nevének minden részét használhatja vagy figyelmen kívül hagyhatja.

A különböző összeállítási feloldási lehetőségek hatásait táblázatként mutatja be a Vegyes névfeloldás szakasz, egyszerű és összeállítással minősített típusnevek esetében.

Típusok feloldása

Ha typeName nem ad meg szerelvénynevet, typeResolver a program mindig meghívja. Ha typeName szerelvénynevet ad meg, a rendszer csak akkor hívja meg, typeResolver ha a szerelvény neve sikeresen feloldva van. Ha assemblyResolver vagy az összeszerelési vizsgálat eredményül ad null, akkor typeResolver nem kerül meghívásra.

A typeResolver metódus három argumentumot kap:

  • A keresendő szerelvény, vagy null ha typeName nem tartalmaz szerelvénynevet.
  • A típus egyszerű neve. Beágyazott típus esetén ez a legkülső tartalmú típus. Általános típus esetén ez az általános típus egyszerű neve.
  • Logikai érték, amely akkor jelenik true meg, ha a típusnevek esetét figyelmen kívül kell hagyni.

A megvalósítás határozza meg az argumentumok használatát. A typeResolver metódusnak vissza kell térnie null , ha nem tudja feloldani a típust. Ha typeResolver visszatér, és null így vanthrowOnError, ez a true túlterhelés egy GetTypeTypeLoadException .

A különböző típusfeloldási lehetőségek hatása táblázatként jelenik meg a Vegyes névfeloldás szakaszban az egyszerű és szerelvény által minősített típusnevek esetében.

Beágyazott típusok feloldása

Ha typeName beágyazott típus, a rendszer csak a legkülső tartalmú típus nevét adja át a rendszernek typeResolver. Ha typeResolver ezt a típust adja vissza, a GetNestedType metódus rekurzívan lesz meghívva, amíg a legbelső beágyazott típus meg nem oldódott.

Általános típusok feloldása

A GetType rendszer rekurzív módon hívja meg az általános típusokat: először magát az általános típust, majd a típusargumentumokat. Ha egy típusargumentum általános, GetType a rendszer rekurzívan hívja meg a típusargumentumok feloldásához, és így tovább.

Ennek a assemblyResolver rekurziónak az összes szintjét képesnek kell lennie feloldani, és typeResolver az ön által megadott kombinációnak is képesnek kell lennie feloldani. Tegyük fel például, hogy megad egy assemblyResolver elemet, amely a MyAssembly betöltését szabályozza. Tegyük fel, hogy meg szeretné oldani az általános típust Dictionary<string, MyType> (Dictionary(Of String, MyType) a Visual Basicben). A következő általános típusnevet adhatja meg:

"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"

Figyelje meg, hogy MyType ez az egyetlen szerelvény-minősített típusargumentum. Az Dictionary<TKey,TValue> és String osztályok neve nincs assembly-minősítéssel ellátva. A typeResolver képesnek kell lennie arra, hogy kezeljen egy szerelvényt vagy null, mert null érkezik Dictionary<TKey,TValue> és String számára. Az esetet úgy tudja kezelni, hogy meghívja a GetType metódusnak azt a túlterhelését, amelyik egy stringet vesz át, mert a nem minősített típusnevek mscorlib.dll/System.Private.CoreLib.dll-ban vannak.

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))

A assemblyResolver metódus nem a szótártípushoz és a sztringtípushoz van meghívva, mert ezek a típusnevek nem szerelvény-minősítéssel rendelkeznek.

Tegyük fel, hogy ahelyettSystem.String, hogy az első általános argumentumtípus a következőtől származikYourTypeYourAssembly:

"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"

Mivel ez a szerelvény nem mscorlib.dll/System.Private.CoreLib.dll, és nem is a jelenleg végrehajtó szerelvény, nem oldható fel YourType szerelvény-minősített név nélkül. Mivel a assemblyResolve rekurzívan lesz meghívva, képesnek kell lennie kezelni ezt az esetet. Ahelyett, hogy a null-től eltérő szerelvényekre MyAssembly térne vissza, most az adott AssemblyName objektummal hajt végre szerelvényterhelést.

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)

Speciális karakterekkel rendelkező típusnevek feloldása

Egyes karakterek különleges jelentéssel rendelkeznek az összeállítás által kvalifikált nevekben. Ha egy egyszerű típusnév tartalmazza ezeket a karaktereket, a karakterek elemzési hibákat okoznak, ha az egyszerű név egy assemblészerinti név része. Az elemzési hibák elkerülése érdekében ki kell vonnia a speciális karaktereket egy fordított perjellel, mielőtt az összeállítással minősített nevet átadná a GetType metódusnak. Ha például egy típus neve el van nevezve Strange]Type, a feloldó karaktert a szögletes zárójel elé kell adni az alábbiak szerint: Strange\]Type.

Megjegyzés:

Az ilyen speciális karaktereket tartalmazó nevek nem hozhatók létre a Visual Basicben vagy a C#-ban, de közös köztes nyelv (CIL) használatával vagy dinamikus szerelvények kibocsátásával hozhatók létre.

Az alábbi táblázat a típusnevek speciális karaktereit mutatja be.

Karakter Értelmezés
, (vessző) Összeállítás által véglegesített nevek elválasztója.
[] (szögletes zárójelek) Utótagpárként egy tömbtípust jelez; határolópárként általános argumentumlistákat és szerelvényhez rendelt neveket foglal magában.
& (és-jel) Utótagként azt jelzi, hogy egy típus referenciatípus.
* (csillagjel) Utótagként azt jelzi, hogy egy típus mutatótípus.
+ (plusz) Elválasztó a beágyazott típusok számára.
\ (fordított perjel) Escape karakter.

Az olyan tulajdonságok, mint a AssemblyQualifiedName, helyesen kódolt sztringeket adnak vissza. Megfelelően kódolt karakterláncokat kell átadnia a GetType metódusnak. Viszont a metódus helyesen kimenekített neveket ad át a GetType és az alapértelmezett típusfeloldási metódusoknak typeResolver. Ha össze kell hasonlítania egy nevet egy nem escape-elt névvel a typeResolver-ben, el kell távolítania az escape karaktereket.

Vegyes névfeloldás

Az alábbi táblázat összefoglalja a assemblyResolver, typeResolver és az alapértelmezett névfeloldás interakcióit a typeName összes típusnév és szerelvénynév kombinációjára.

Típusnév tartalma Szerelvénymegoldó módszer Típusfeloldó metódus Eredmény
típus, szerelvény null null Egyenértékű a Type.GetType(String, Boolean, Boolean) metódus túlterhelése meghívásával.
típus, szerelvény biztosítva null assemblyResolver visszaadja a szerelvényt, vagy null-t ad vissza, ha nem tudja felismerni a szerelvényt. Ha az összeállítást feloldották, a rendszer a Assembly.GetType(String, Boolean, Boolean) metódust túlterheléssel használja a típus összeállításból történő betöltéséhez, ellenkező esetben nem próbálkozik a típus feloldásával.
típus, szerelvény null biztosítva Egyenértékű a szerelvény nevének AssemblyName objektummá alakításával és a szerelvény lekéréséhez szükséges metódustúlterhelés Assembly.Load(AssemblyName) meghívásával. Ha a szerelvény feloldódik, akkor átkerül typeResolver-hoz; ellenkező esetben typeResolver nem kerül meghívásra, és nincs további kísérlet a típus feloldására.
típus, szerelvény biztosítva biztosítva assemblyResolver visszaadja a szerelvényt, vagy null-t ad vissza, ha nem tudja felismerni a szerelvényt. Ha a szerelvény feloldódik, akkor átkerül typeResolver-hoz; ellenkező esetben typeResolver nem kerül meghívásra, és nincs további kísérlet a típus feloldására.
típus null, megadva null Egyenértékű a Type.GetType(String, Boolean, Boolean) metódus túlterhelése meghívásával. Mivel a szerelvény neve nincs megadva, a rendszer csak mscorlib.dll/System.Private.CoreLib.dll és az éppen futó szerelvényt keresi. Ha assemblyResolver meg van adva, a rendszer figyelmen kívül hagyja.
típus null, megadva biztosítva typeResolver meghívásra kerül, és null átadásra kerül a szerelvénynek. typeResolver bármilyen összeállításból megadhat egy típust, beleértve azokat az összeállításokat is, amelyeket erre a célra tölt be. Ha assemblyResolver meg van adva, a rendszer figyelmen kívül hagyja.
kódösszeállítás null, megadva null, megadva Az A FileLoadException parancs azért van dobva, mert a szerelvény neve úgy van elemezve, mintha egy szerelvény által minősített típusnév lenne. Ez érvénytelen szerelvénynevet eredményez.