Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Gunakan overload metode GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) dan overload terkait (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) dan GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) untuk mengganti implementasi metode GetType default dengan implementasi yang lebih fleksibel. Dengan menyediakan metode Anda sendiri yang menentukan nama tipe dan nama rakitan yang mengandungnya, Anda dapat melakukan hal berikut:
- Kendalikan versi rakitan mana yang digunakan untuk memuat tipe tertentu.
- Sediakan tempat lain untuk mencari nama tipe yang tidak menyertakan nama rakitan.
- Muat rakitan menggunakan nama rakitan parsial.
- Mengembalikan subkelas dari System.Type yang tidak dibuat oleh Common Language Runtime (CLR).
Misalnya, dalam serialisasi yang toleran terhadap versi, metode ini memungkinkan Anda mencari rakitan "paling sesuai" dengan menggunakan nama parsial. Varian lain dari metode GetType memerlukan nama tipe yang memenuhi syarat rakitan, yang mencakup nomor versi.
Implementasi alternatif dari sistem tipe mungkin perlu mengembalikan subkelas System.Type yang tidak dibuat oleh CLR; semua tipe yang dikembalikan oleh overload lainnya dari metode GetType adalah tipe waktu eksekusi.
Catatan penggunaan
Metode ini dan metode overload terkaitnya mengurai typeName menjadi nama tipe dan nama assembly, lalu menyelesaikan nama-nama tersebut. Resolusi nama rakitan terjadi sebelum resolusi nama tipe, karena nama tipe harus diselesaikan dalam konteks rakitan.
Nota
Jika Anda tidak terbiasa dengan konsep nama jenis yang dengan kualifikasi majelis, lihat properti AssemblyQualifiedName.
Jika typeName bukan nama assembly-qualified, penyelesaian assembly akan diabaikan. Nama tipe tak bersyarat dapat diselesaikan dalam konteks mscorlib.dll/System.Private.CoreLib.dll atau rakitan yang sedang dieksekusi, atau Anda dapat juga menyediakan rakitan dalam parameter typeResolver. Efek menyertakan atau menghilangkan nama rakitan untuk berbagai jenis resolusi nama ditampilkan sebagai tabel di bagian Resolusi nama campuran .
Catatan penggunaan umum:
Jangan meneruskan metode ke
assemblyResolveratautypeResolverjika mereka berasal dari penelepon yang tidak dikenal atau tidak tepercaya. Gunakan hanya metode yang Anda berikan atau yang Anda kenal.Perhatian
Menggunakan metode dari penelepon yang tidak diketahui atau tidak tepercaya dapat mengakibatkan peningkatan hak istimewa untuk kode berbahaya.
Jika Anda menghilangkan
assemblyResolverparameter dan/atautypeResolver, nilaithrowOnErrorparameter diteruskan ke metode yang melakukan resolusi default.Jika
throwOnErroradalahtrue, metode ini melemparkan TypeLoadException ketikatypeResolvermengembalikannull, dan FileNotFoundException ketikaassemblyResolvermengembalikannull.Metode ini tidak menangkap pengecualian yang dilemparkan oleh
assemblyResolverdantypeResolver. Anda bertanggung jawab atas pengecualian apa pun yang dilemparkan oleh metode resolver.
Mengatasi rakitan
Metode assemblyResolver ini menerima AssemblyName objek, yang diproduksi dengan mengurai nama rakitan string yang disertakan dalam typeName. Jika typeName tidak berisi nama rakitan, assemblyResolver tidak dipanggil dan null diteruskan ke typeResolver.
Jika assemblyResolver tidak disediakan, pemeriksaan rakitan standar digunakan untuk menemukan perakitan. Jika assemblyResolver disediakan, metode GetType tidak melakukan pemeriksaan standar; dalam hal ini, Anda harus memastikan bahwa assemblyResolver Anda dapat menangani semua assembly yang Anda berikan padanya.
Metode assemblyResolver harus mengembalikan null jika rakitan tidak dapat diselesaikan. Jika assemblyResolver mengembalikan null, typeResolver tidak dipanggil dan tidak ada pemrosesan lebih lanjut yang terjadi; selain itu, jika throwOnError adalah true, a FileNotFoundException dilemparkan.
AssemblyName Jika yang diteruskan ke assemblyResolver adalah nama parsial, satu atau beberapa bagiannya adalah null. Misalnya, jika tidak memiliki versi, Version propertinya adalah null. Jika properti Version, properti CultureInfo, dan metode GetPublicKeyToken semuanya mengembalikan null, maka hanya nama aslinya dari assembly yang disediakan. Metode assemblyResolver ini dapat menggunakan atau mengabaikan semua bagian dari nama rakitan.
Efek dari opsi penyelesaian perakitan yang berbeda ditampilkan sebagai tabel di bagian Penyelesaian nama campuran, untuk nama jenis yang sederhana dan yang memenuhi syarat perakitan.
Menyelesaikan jenis-jenis
Jika typeName tidak menentukan nama rakitan, typeResolver selalu dipanggil. Jika typeName menentukan nama rakitan, typeResolver hanya dipanggil ketika nama rakitan berhasil diselesaikan. Jika assemblyResolver atau pemeriksaan rakitan standar mengembalikan null, typeResolver tidak dipanggil.
Metode typeResolver menerima tiga argumen:
- Rakitan yang dicari atau
nulljikatypeNametidak mengandung nama rakitan. - Nama sederhana tipe tersebut. Dalam kasus jenis berlapis, ini adalah jenis terluar yang berisi. Dalam kasus jenis generik, ini adalah nama sederhana dari jenis generik.
- Nilai Boolean
trueyang jika kasus nama jenis akan diabaikan.
Implementasi menentukan cara argumen ini digunakan. Metode typeResolver harus mengembalikan null jika tidak dapat menyelesaikan jenis. Jika typeResolver mengembalikan null dan throwOnError adalah true, kelebihan beban GetType ini akan melempar TypeLoadException.
Efek dari opsi resolusi jenis yang berbeda ditampilkan sebagai tabel di bagian Resolusi nama campuran , untuk nama jenis sederhana dan memenuhi syarat rakitan.
Menyelesaikan tipe bersarang
Jika typeName adalah tipe bersarang, hanya nama tipe yang paling luar yang diteruskan ke typeResolver. Ketika typeResolver mengembalikan jenis ini, metode GetNestedType dipanggil secara rekursif hingga jenis bersarang terdalam telah diselesaikan.
Mengatasi jenis generik
GetType dipanggil secara rekursif untuk menyelesaikan tipe generik: Pertama untuk menyelesaikan tipe generik itu sendiri, lalu untuk menyelesaikan argumen tipenya. Jika argumen jenis umum, GetType dipanggil secara rekursif untuk menyelesaikan argumen jenisnya, dan sebagainya.
Kombinasi assemblyResolver dan typeResolver yang Anda berikan harus mampu menyelesaikan semua tingkat rekursi ini. Misalnya, Anda menyediakan assemblyResolver yang mengontrol pemuatan MyAssembly. Misalkan Anda ingin mengatasi jenis Dictionary<string, MyType> generik (Dictionary(Of String, MyType) di Visual Basic). Anda mungkin meneruskan nama jenis generik berikut:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Perhatikan bahwa MyType adalah satu-satunya argumen jenis yang memenuhi syarat rakitan. Nama kelas Dictionary<TKey,TValue> dan String tidak memenuhi kualifikasi perakitan. Anda typeResolver harus dapat menangani rakitan atau null, karena akan menerima null untuk Dictionary<TKey,TValue> dan String. Ini dapat menangani kasus itu dengan memanggil overload dari metode GetType yang menerima string, karena nama jenis yang tidak memenuhi syarat dari kedua tipe tersebut berada di 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))
Metode assemblyResolver ini tidak dipanggil untuk jenis kamus dan jenis string, karena nama jenis tersebut tidak memenuhi syarat saat panggilan assembly.
Sekarang misalkan bahwa alih-alih System.String, jenis argumen generik pertama adalah YourType, dari YourAssembly:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Karena assembly ini bukan mscorlib.dll/System.Private.CoreLib.dll atau assembly yang sedang dijalankan, Anda tidak dapat menyelesaikan YourType tanpa nama yang memenuhi syarat assembly. Karena assemblyResolve akan dipanggil secara rekursif, itu harus dapat menangani kasus ini. Alih-alih mengembalikan null untuk rakitan selain MyAssembly, sekarang ia melakukan pemuatan rakitan menggunakan objek yang disediakan AssemblyName .
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)
Menyelesaikan nama jenis dengan karakter khusus
Karakter tertentu memiliki arti khusus dalam nama yang memenuhi syarat perakitan. Jika nama jenis sederhana berisi karakter ini, karakter menyebabkan kesalahan penguraian ketika nama sederhana adalah bagian dari nama yang memenuhi syarat rakitan. Untuk menghindari kesalahan penguraian, Anda harus melewati karakter khusus dengan menggunakan garis miring terbalik sebelum Anda dapat meneruskan nama yang memenuhi syarat untuk rakitan ke metode GetType. Misalnya, jika jenis diberi nama Strange]Type, karakter escape harus ditambahkan di depan kurung siku sebagai berikut: Strange\]Type.
Nota
Nama dengan karakter khusus tersebut tidak dapat dibuat di Visual Basic atau C#, tetapi dapat dibuat dengan menggunakan bahasa perantara umum (CIL) atau dengan memancarkan rakitan dinamis.
Tabel berikut ini memperlihatkan karakter khusus untuk nama jenis.
| Karakter | Makna |
|---|---|
, (koma) |
Pembatas untuk nama yang memenuhi syarat rakitan. |
[] (Kurung siku) |
Sebagai pasangan akhiran, menunjukkan jenis array; sebagai pasangan pemisah, mengapit daftar argumen generik dan nama yang memenuhi syarat perakitan. |
& (dan-dan) |
Sebagai akhiran, menunjukkan bahwa suatu tipe adalah tipe referensi. |
* (tanda bintang) |
Sebagai akhiran, menunjukkan bahwa tipe tersebut adalah tipe penunjuk. |
+ (ditambah) |
Pemisah untuk tipe bersarang. |
\ (garis miring terbelakang) |
Karakter escape. |
Properti seperti AssemblyQualifiedName menampilkan string yang lolos dengan benar. Anda harus meneruskan string yang telah di-escape dengan benar ke metode GetType. Pada gilirannya, metode GetType meneruskan nama yang sudah diekspansi dengan benar ke typeResolver dan ke metode resolusi tipe bawaan. Jika Anda perlu membandingkan nama dengan nama yang tidak diescaped di typeResolver, Anda harus menghapus karakter escape.
Resolusi nama campuran
Tabel berikut ini meringkas interaksi antara assemblyResolver, , typeResolverdan resolusi nama default, untuk semua kombinasi nama jenis dan nama rakitan di typeName:
| Isi nama tipe | Metode pemecahan perakitan | Metode penyelesai tipe | Hasil |
|---|---|---|---|
| jenis, rakitan | nul | nul | Setara dengan memanggil metode overload Type.GetType(String, Boolean, Boolean). |
| jenis, rakitan | Disediakan | nul |
assemblyResolver mengembalikan assembly atau mengembalikan null jika tidak dapat menyelesaikan assembly. Jika assembly dapat diuraikan, metode overload Assembly.GetType(String, Boolean, Boolean) digunakan untuk memuat tipe dari assembly; jika tidak, tidak ada upaya untuk menguraikan tipe. |
| jenis, rakitan | nul | Disediakan | Setara dengan mengonversi nama assembly menjadi objek AssemblyName dan memanggil overload metode Assembly.Load(AssemblyName) untuk mendapatkan assembly. Jika assembly diselesaikan, itu diteruskan ke typeResolver; jika tidak, typeResolver tidak dipanggil dan tidak ada usaha lebih lanjut untuk menyelesaikan tipe. |
| jenis, rakitan | Disediakan | Disediakan |
assemblyResolver mengembalikan assembly atau mengembalikan null jika tidak dapat menyelesaikan assembly. Jika assembly diselesaikan, itu diteruskan ke typeResolver; jika tidak, typeResolver tidak dipanggil dan tidak ada usaha lebih lanjut untuk menyelesaikan tipe. |
| tipe | null, disediakan | nul | Setara dengan memanggil metode overload Type.GetType(String, Boolean, Boolean). Karena nama rakitan tidak disediakan, hanya mscorlib.dll/System.Private.CoreLib.dll dan rakitan yang sedang dijalankan yang dicari. Jika assemblyResolver disediakan, itu diabaikan. |
| tipe | null, disediakan | Disediakan |
typeResolver dipanggil, dan null diteruskan untuk assembly.
typeResolver dapat menyediakan jenis dari rakitan apa pun, termasuk rakitan yang dimuatnya untuk tujuan tersebut. Jika assemblyResolver disediakan, itu diabaikan. |
| pertemuan | null, disediakan | null, disediakan | A FileLoadException dilemparkan, karena nama rakitan diurai seolah-olah itu adalah nama jenis yang memenuhi syarat rakitan. Ini menghasilkan nama rakitan yang tidak valid. |