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 atau typeResolver 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/atau typeResolver , nilai throwOnError parameter diteruskan ke metode yang melakukan resolusi default.

  • Jika throwOnError adalah true, metode ini melemparkan TypeLoadException ketika typeResolver mengembalikan null, dan FileNotFoundException ketika assemblyResolver mengembalikan null.

  • Metode ini tidak menangkap pengecualian yang dilemparkan oleh assemblyResolver dan typeResolver. 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 jika typeName 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, , typeResolverdan 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.