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 lub typeResolver 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/lub typeResolver , wartość parametru throwOnError jest przekazywana do metod wykonujących rozdzielczość domyślną.

  • Jeśli throwOnError parametr ma truewartość , ta metoda zgłasza wyjątek TypeLoadException when typeResolver zwraca wartość null, a parametr FileNotFoundException when assemblyResolver zwraca wartość null.

  • Ta metoda nie przechwytuje wyjątków zgłaszanych przez assemblyResolver i typeResolver. 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 typeNamepliku . 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 assemblyResolvernull , jeśli nie można rozpoznać zestawu. Jeśli assemblyResolver funkcja zwraca nullwartość , typeResolver nie jest wywoływana i nie ma dalszego przetwarzania; ponadto, jeśli throwOnError jest trueto , 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ą nullwartość , 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 nullwartość , typeResolver nie jest wywoływana.

Metoda typeResolver odbiera trzy argumenty:

  • Zestaw do wyszukiwania lub null jeśli typeName 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 typeResolvernull , jeśli nie może rozpoznać typu. Jeśli typeResolver funkcja zwraca null wartość i throwOnError ma truewartość , 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.Stringogó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 assemblyResolvertypeResolver, 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.