Metody System.Type.GetType
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Użyj przeciążenia metody i skojarzonych z nią przeciążeń (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) i GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)), aby zastąpić domyślną implementację GetType metody bardziej elastycznymi implementacjami. Podając własne metody rozpoznawania nazw typów i nazw zestawów, które je zawierają, można wykonać następujące czynności:
- Kontrolowanie wersji zestawu, z której jest ładowany typ.
- Podaj inne miejsce, aby wyszukać nazwę typu, która nie zawiera nazwy zestawu.
- Ładowanie zestawów przy użyciu częściowych nazw zestawów.
- Zwracanie podklas, System.Type które nie są tworzone przez środowisko uruchomieniowe języka wspólnego (CLR).
Na przykład w przypadku serializacji odpornej na wersje ta metoda umożliwia wyszukiwanie zestawu "najlepiej dopasowane" przy użyciu częściowej nazwy. Inne przeciążenia GetType metody wymagają nazwy typu kwalifikowanego przez zestaw, który zawiera numer wersji.
Alternatywne implementacje systemu typów mogą wymagać zwrócenia podklas System.Type , które nie są tworzone przez CLR; wszystkie typy zwracane przez inne przeciążenia metody są typami GetType środowiska uruchomieniowego.
Uwagi dotyczące użycia
Ta metoda przeciąża i skojarzone z nią przeciążenia analizuje typeName
nazwę typu i nazwę zestawu, a następnie rozpoznaj nazwy. Rozpoznawanie nazwy zestawu występuje przed rozpoznawaniem nazwy typu, ponieważ należy rozpoznać nazwę typu w kontekście zestawu.
Uwaga
Jeśli nie znasz pojęcia nazw typów kwalifikowanych przez zestaw, zobacz AssemblyQualifiedName właściwość .
Jeśli typeName
nie jest kwalifikowaną nazwą zestawu, rozwiązanie zestawu zostanie pominięte. Niekwalifikowane nazwy typów można rozpoznać w kontekście mscorlib.dll/System.Private.CoreLib.dll lub aktualnie wykonywanego zestawu lub opcjonalnie można podać zestaw w parametrze typeResolver
. Efekty dołączania lub pomijania nazwy zestawu dla różnych rodzajów rozpoznawania nazw są wyświetlane jako tabela w sekcji Rozpoznawanie nazw mieszanych.
Ogólne informacje o użyciu:
Nie przekazuj metod do
assemblyResolver
lubtypeResolver
jeśli pochodzą z nieznanych lub niezaufanych wywołujących. Użyj tylko określonych przez siebie metod lub tych, które znasz.Uwaga
Użycie metod z nieznanych lub niezaufanych wywołań może spowodować podniesienie uprawnień dla złośliwego kodu.
Jeśli pominięto
assemblyResolver
parametry i/lubtypeResolver
, wartość parametruthrowOnError
jest przekazywana do metod wykonujących rozdzielczość domyślną.Jeśli
throwOnError
parametr matrue
wartość , ta metoda zgłasza wyjątek TypeLoadException whentypeResolver
zwraca wartośćnull
, a parametr FileNotFoundException whenassemblyResolver
zwraca wartośćnull
.Ta metoda nie przechwytuje wyjątków zgłaszanych przez
assemblyResolver
itypeResolver
. Użytkownik jest odpowiedzialny za wszelkie wyjątki zgłaszane przez metody rozpoznawania nazw.
Rozwiązywanie problemów z zestawami
Metoda assemblyResolver
odbiera AssemblyName obiekt, który jest generowany przez analizowanie nazwy zestawu ciągów, która jest zawarta w typeName
pliku . Jeśli typeName
nie zawiera nazwy zestawu, assemblyResolver
nie jest wywoływana i null
jest przekazywana do typeResolver
.
Jeśli assemblyResolver
zestaw nie jest dostarczany, standardowe sondowanie zestawów jest używane do lokalizowania zestawu. Jeśli assemblyResolver
zostanie podana GetType , metoda nie wykonuje standardowego sondowania. W takim przypadku należy upewnić się, że assemblyResolver
będzie można obsłużyć wszystkie przekazane do niego zestawy.
Metoda powinna zostać zwrócona assemblyResolver
null
, jeśli nie można rozpoznać zestawu. Jeśli assemblyResolver
funkcja zwraca null
wartość , typeResolver
nie jest wywoływana i nie ma dalszego przetwarzania; ponadto, jeśli throwOnError
jest true
to , FileNotFoundException jest zgłaszany.
Jeśli przekazana AssemblyNameassemblyResolver
wartość jest nazwą częściową, co najmniej jedna z jej części to null
. Jeśli na przykład nie ma wersji, Version właściwość to null
. Version Jeśli właściwość, CultureInfo właściwość i GetPublicKeyToken metoda wszystkie zwracają null
wartość , podano tylko prostą nazwę zestawu. Metoda assemblyResolver
może używać lub ignorować wszystkie części nazwy zestawu.
Efekty różnych opcji rozpoznawania zestawów są wyświetlane jako tabela w sekcji Rozpoznawanie nazw mieszanych dla prostych i kwalifikowanych zestawów nazw.
Rozwiązywanie problemów z typami
Jeśli typeName
nie określi nazwy zestawu, typeResolver
zawsze jest wywoływana. Jeśli typeName
określa nazwę zestawu, jest wywoływana tylko wtedy, typeResolver
gdy nazwa zestawu zostanie pomyślnie rozpoznana. Jeśli assemblyResolver
lub standardowe sondowanie zestawu zwraca null
wartość , typeResolver
nie jest wywoływana.
Metoda typeResolver
odbiera trzy argumenty:
- Zestaw do wyszukiwania lub
null
jeślitypeName
nie zawiera nazwy zestawu. - Prosta nazwa typu. W przypadku typu zagnieżdżonego jest to najbardziej zewnętrzny typ zawierający. W przypadku typu ogólnego jest to prosta nazwa typu ogólnego.
- Wartość logiczna, która ma
true
być ignorowana, jeśli wielkość nazw typów ma być ignorowana.
Implementacja określa sposób użycia tych argumentów. Metoda powinna zostać zwrócona typeResolver
null
, jeśli nie może rozpoznać typu. Jeśli typeResolver
funkcja zwraca null
wartość i throwOnError
ma true
wartość , to przeciążenie GetType zgłasza błąd TypeLoadException.
Efekty różnych opcji rozpoznawania typów są wyświetlane jako tabela w sekcji Rozpoznawanie nazw mieszanych dla prostych i kwalifikowanych przez zestaw nazw typów.
Rozpoznawanie typów zagnieżdżonych
Jeśli typeName
jest typem zagnieżdżonym, tylko nazwa najbardziej zewnętrznego typu zawierającego jest przekazywana do typeResolver
. Gdy typeResolver
zwraca ten typ, GetNestedType metoda jest wywoływana rekursywnie do momentu rozwiązania najbardziej zagnieżdżonego typu wewnętrznego.
Rozwiązywanie problemów z typami ogólnymi
Element GetType jest wywoływany rekursywnie w celu rozpoznania typów ogólnych: najpierw w celu rozpoznania samego typu ogólnego, a następnie rozpoznawania argumentów typu. Jeśli argument typu jest ogólny, jest wywoływany rekursywnie w GetType celu rozpoznania argumentów typu itd.
Kombinacja parametrów assemblyResolver
i typeResolver
, które należy podać, musi być w stanie rozpoznać wszystkie poziomy tej rekursji. Załóżmy na przykład, że podajesz element assemblyResolver
, który kontroluje ładowanie elementu MyAssembly
. Załóżmy, że chcesz rozpoznać typ Dictionary<string, MyType>
ogólny (Dictionary(Of String, MyType)
w Visual Basic). Możesz przekazać następującą nazwę typu ogólnego:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Zwróć uwagę, że MyType
jest to jedyny argument typu kwalifikowanego przez zestaw. Nazwy Dictionary<TKey,TValue> klas i String nie są kwalifikowane przez zestaw. typeResolver
Musi być w stanie obsłużyć zestaw lub null
, ponieważ zostanie on odebrany null
dla Dictionary<TKey,TValue> i String. Może obsłużyć ten przypadek, wywołując przeciążenie GetType metody, która przyjmuje ciąg, ponieważ obie niekwalifikowane nazwy typów znajdują się w 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
nie jest wywoływana dla typu słownika i typu ciągu, ponieważ te nazwy typów nie są kwalifikowane przez zestaw.
Teraz załóżmy, że zamiast , pierwszym typem argumentu System.String
ogólnego jest YourType
, z :YourAssembly
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Ponieważ ten zestaw nie jest ani mscorlib.dll/System.Private.CoreLib.dll, ani obecnie wykonujący zestaw, nie można rozpoznać YourType
bez nazwy kwalifikowanej do zestawu. assemblyResolve
Ponieważ będzie ona wywoływana rekursywnie, musi być w stanie obsłużyć ten przypadek. Zamiast zwracać null
zestawy inne niż MyAssembly
, teraz wykonuje obciążenie zestawu przy użyciu dostarczonego AssemblyName obiektu.
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)
Rozpoznawanie nazw typów ze znakami specjalnymi
Niektóre znaki mają specjalne znaczenie w nazwach kwalifikowanych przez zestaw. Jeśli prosta nazwa typu zawiera te znaki, znaki powodują błędy analizowania, gdy prosta nazwa jest częścią nazwy kwalifikowanej zestawu. Aby uniknąć błędów analizowania, przed przekazaniem nazwy GetType kwalifikowanej do zestawu do metody należy uruchomić znaki specjalne z ukośnikiem odwrotnym. Jeśli na przykład typ ma nazwę Strange]Type
, znak ucieczki musi zostać dodany przed nawiasem kwadratowym w następujący sposób: Strange\]Type
.
Uwaga
Nazwy z takimi znakami specjalnymi nie mogą być tworzone w języku Visual Basic lub C#, ale mogą być tworzone przy użyciu wspólnego języka pośredniego (CIL) lub emitowania zestawów dynamicznych.
W poniższej tabeli przedstawiono znaki specjalne dla nazw typów.
Znak | Znaczenie |
---|---|
, (przecinek) |
Ogranicznik nazw kwalifikowanych do zestawu. |
[] (nawiasy kwadratowe) |
Jako para sufiksów wskazuje typ tablicy; jako para ograniczników ujęta jest w ogólne listy argumentów i nazwy kwalifikowane zestawów. |
& (ampersand) |
Jako sufiks wskazuje, że typ jest typem odwołania. |
* (gwiazdka) |
Jako sufiks wskazuje, że typ jest typem wskaźnika. |
+ (plus) |
Ogranicznik dla typów zagnieżdżonych. |
\ (ukośnik odwrotny) |
Znak ucieczki. |
Właściwości, takie jak AssemblyQualifiedName zwracanie poprawnie uniknięć ciągów. Należy prawidłowo przekazać ciągi ucieczki do GetType metody . Z kolei GetType metoda przekazuje poprawnie nazwy ucieczki do typeResolver
i do domyślnych metod rozpoznawania typów. Jeśli musisz porównać nazwę z niezasłaną nazwą w pliku typeResolver
, musisz usunąć znaki ucieczki.
Rozpoznawanie nazw mieszanych
W poniższej tabeli podsumowano interakcje między assemblyResolver
typeResolver
, i domyślnym rozpoznawaniem nazw dla wszystkich kombinacji nazwy typu i nazwy zestawu w pliku typeName
:
Zawartość nazwy typu | Metoda rozpoznawania zestawów | Metoda rozpoznawania typów | Result |
---|---|---|---|
typ, zestaw | null | null | Odpowiednik wywołania Type.GetType(String, Boolean, Boolean) przeciążenia metody. |
typ, zestaw | podano | null | assemblyResolver zwraca zestaw lub zwraca null wartość , jeśli nie może rozpoznać zestawu. Jeśli zestaw zostanie rozwiązany, Assembly.GetType(String, Boolean, Boolean) przeciążenie metody jest używane do ładowania typu z zestawu; w przeciwnym razie nie ma próby rozpoznania typu. |
typ, zestaw | null | podano | Odpowiednik konwertowania nazwy zestawu na AssemblyName obiekt i wywoływania Assembly.Load(AssemblyName) przeciążenia metody w celu pobrania zestawu. Jeśli zestaw zostanie rozwiązany, zostanie przekazany do typeResolver ; w przeciwnym razie typeResolver nie jest wywoływany i nie ma dalszych prób rozwiązania tego typu. |
typ, zestaw | podano | podano | assemblyResolver zwraca zestaw lub zwraca null wartość , jeśli nie może rozpoznać zestawu. Jeśli zestaw zostanie rozwiązany, zostanie przekazany do typeResolver ; w przeciwnym razie typeResolver nie jest wywoływany i nie ma dalszych prób rozwiązania tego typu. |
type | wartość NULL, podana | null | Odpowiednik wywołania Type.GetType(String, Boolean, Boolean) przeciążenia metody. Ponieważ nazwa zestawu nie jest podana, przeszukane są tylko mscorlib.dll/System.Private.CoreLib.dll i aktualnie wykonywany zestaw. Jeśli assemblyResolver zostanie podana wartość , zostanie ona zignorowana. |
type | wartość NULL, podana | podano | typeResolver jest wywoływana i null jest przekazywana dla zestawu. typeResolver może dostarczyć typ z dowolnego zestawu, w tym zestawy ładowane do tego celu. Jeśli assemblyResolver zostanie podana wartość , zostanie ona zignorowana. |
zestaw | wartość NULL, podana | wartość NULL, podana | Element FileLoadException jest zgłaszany, ponieważ nazwa zestawu jest analizowana tak, jakby była to nazwa typu kwalifikowanego przez zestaw. Spowoduje to nieprawidłową nazwę zestawu. |