Metode System.Type.GetType
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Gunakan metode kelebihan beban dan kelebihan beban 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 GetType default metode dengan implementasi yang lebih fleksibel. Dengan menyediakan metode Anda sendiri yang menyelesaikan nama jenis dan nama rakitan yang berisinya, Anda dapat melakukan hal berikut:
- Mengontrol versi rakitan mana dari jenis yang dimuat.
- Sediakan tempat lain untuk mencari nama jenis yang tidak menyertakan nama rakitan.
- Muat rakitan menggunakan nama rakitan parsial.
- Mengembalikan subkelas System.Type yang tidak dibuat oleh runtime bahasa umum (CLR).
Misalnya, dalam serialisasi toleransi versi metode ini memungkinkan Anda mencari rakitan "paling cocok" dengan menggunakan nama parsial. Kelebihan metode GetType lainnya memerlukan nama jenis yang memenuhi syarat rakitan, yang mencakup nomor versi.
Implementasi alternatif dari sistem jenis mungkin perlu mengembalikan subkelas System.Type yang tidak dibuat oleh CLR; semua jenis yang dikembalikan oleh kelebihan beban GetType metode lainnya adalah jenis runtime.
Catatan penggunaan
Metode ini kelebihan beban dan kelebihan beban typeName
terkait mengurai ke dalam nama jenis dan nama assembly, lalu menyelesaikan nama. Resolusi nama rakitan terjadi sebelum resolusi nama jenis, karena nama jenis harus diselesaikan dalam konteks rakitan.
Catatan
Jika Anda tidak terbiasa dengan konsep nama jenis yang memenuhi syarat rakitan, lihat AssemblyQualifiedName properti .
Jika typeName
bukan nama assembly-qualified, resolusi assembly akan dilewati. Nama jenis yang tidak memenuhi syarat dapat diselesaikan dalam konteks mscorlib.dll/System.Private.CoreLib.dll atau rakitan yang sedang dijalankan, atau Anda dapat secara opsional memberikan rakitan dalam typeResolver
parameter . 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
assemblyResolver
atautypeResolver
jika 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
assemblyResolver
parameter dan/atautypeResolver
, nilaithrowOnError
parameter diteruskan ke metode yang melakukan resolusi default.Jika
throwOnError
adalahtrue
, metode ini melemparkan TypeLoadException ketikatypeResolver
mengembalikannull
, dan FileNotFoundException ketikaassemblyResolver
mengembalikannull
.Metode ini tidak menangkap pengecualian yang dilemparkan oleh
assemblyResolver
dantypeResolver
. 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, GetType metode ini tidak melakukan pemeriksaan standar; dalam hal ini Anda harus memastikan bahwa Anda assemblyResolver
dapat menangani semua rakitan 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
. Version Jika properti, CultureInfo properti, dan GetPublicKeyToken metode semuanya mengembalikan null
, maka hanya nama sederhana assembly yang disediakan. Metode ini assemblyResolver
dapat menggunakan atau mengabaikan semua bagian nama rakitan.
Efek opsi resolusi rakitan yang berbeda ditampilkan sebagai tabel di bagian Resolusi nama campuran, untuk nama jenis sederhana dan memenuhi syarat rakitan.
Mengatasi 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 untuk mencari atau
null
jikatypeName
tidak berisi nama rakitan. - Nama sederhana dari jenis tersebut. Dalam kasus jenis berlapis, ini adalah jenis terluar yang berisi. Dalam kasus jenis generik, ini adalah nama sederhana dari jenis generik.
- Nilai Boolean
true
yang 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.
Mengatasi jenis berlapis
Jika typeName
adalah jenis berlapis, hanya nama terluar yang berisi jenis yang diteruskan ke typeResolver
. Ketika typeResolver
mengembalikan jenis ini, GetNestedType metode ini dipanggil secara rekursif sampai jenis berlapis terdalu telah diselesaikan.
Mengatasi jenis generik
dipanggil GetType secara rekursif untuk mengatasi jenis generik: Pertama untuk menyelesaikan jenis generik itu sendiri, lalu untuk menyelesaikan argumen jenisnya. 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 Dictionary<TKey,TValue> kelas dan String tidak memenuhi syarat assembly. Anda typeResolver
harus dapat menangani rakitan atau null
, karena akan menerima null
untuk Dictionary<TKey,TValue> dan String. Ini dapat menangani kasus tersebut dengan memanggil kelebihan beban GetType metode yang mengambil string, karena kedua nama jenis yang tidak memenuhi syarat berada dalam 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 rakitan.
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 maupun assembly yang sedang dijalankan, Anda tidak dapat menyelesaikan YourType
tanpa nama yang memenuhi syarat assembly. Karena Anda 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)
Mengatasi nama jenis dengan karakter khusus
Karakter tertentu memiliki arti khusus dalam nama yang memenuhi syarat rakitan. 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 menghindari karakter khusus dengan garis miring terbalik sebelum Anda dapat meneruskan nama yang memenuhi syarat rakitan ke GetType metode . Misalnya, jika jenis diberi nama Strange]Type
, karakter escape harus ditambahkan di depan kurung siku sebagai berikut: Strange\]Type
.
Catatan
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, sertakan daftar argumen generik dan nama yang memenuhi syarat rakitan. |
& (ampersand) |
Sebagai akhiran, menunjukkan bahwa jenis adalah jenis referensi. |
* (tanda bintang) |
Sebagai akhiran, menunjukkan bahwa jenis adalah jenis penunjuk. |
+ (plus) |
Pemisah untuk jenis berlapis. |
\ (garis miring terbelakang) |
Karakter escape. |
Properti seperti AssemblyQualifiedName menampilkan string yang lolos dengan benar. Anda harus meneruskan string yang lolos dengan benar ke GetType metode . Pada gilirannya GetType , metode meneruskan nama yang lolos dengan benar ke typeResolver
dan ke metode resolusi jenis default. 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
, , typeResolver
dan resolusi nama default, untuk semua kombinasi nama jenis dan nama rakitan di typeName
:
Isi nama tipe | Metode penyelesai rakitan | Metode pemecah masalah jenis | Hasil |
---|---|---|---|
jenis, rakitan | null | null | Setara dengan memanggil Type.GetType(String, Boolean, Boolean) metode kelebihan beban. |
jenis, rakitan | Disediakan | nihil | assemblyResolver mengembalikan assembly atau mengembalikan null jika tidak dapat menyelesaikan assembly. Jika assembly diselesaikan, Assembly.GetType(String, Boolean, Boolean) metode overload digunakan untuk memuat jenis dari assembly; jika tidak, tidak ada upaya untuk menyelesaikan jenis. |
jenis, rakitan | nihil | Disediakan | Setara dengan mengonversi nama rakitan menjadi AssemblyName objek dan memanggil Assembly.Load(AssemblyName) metode kelebihan beban untuk mendapatkan assembly. Jika assembly diselesaikan, itu diteruskan ke typeResolver ; jika tidak, typeResolver tidak dipanggil dan tidak ada upaya lebih lanjut untuk menyelesaikan jenis. |
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 upaya lebih lanjut untuk menyelesaikan jenis. |
jenis | null, disediakan | nihil | Setara dengan memanggil Type.GetType(String, Boolean, Boolean) metode kelebihan beban. Karena nama rakitan tidak disediakan, hanya mscorlib.dll/System.Private.CoreLib.dll dan rakitan yang sedang dijalankan dicari. Jika assemblyResolver disediakan, itu diabaikan. |
jenis | 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. |
rakitan | 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. |
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk