Kelas System.Reflection.Emit.TypeBuilder
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
TypeBuilder adalah kelas akar yang digunakan untuk mengontrol pembuatan kelas dinamis dalam runtime. Ini menyediakan serangkaian rutinitas yang digunakan untuk menentukan kelas, menambahkan metode dan bidang, dan membuat kelas di dalam modul. TypeBuilder Baru dapat dibuat dari modul dinamis dengan memanggil ModuleBuilder.DefineType metode , yang mengembalikan TypeBuilder objek.
Pancaran pantulan menyediakan opsi berikut untuk menentukan jenis:
- Tentukan kelas atau antarmuka dengan nama yang diberikan.
- Tentukan kelas atau antarmuka dengan nama dan atribut yang diberikan.
- Tentukan kelas dengan nama, atribut, dan kelas dasar yang diberikan.
- Tentukan kelas dengan nama, atribut, kelas dasar, dan set antarmuka yang diterapkan kelas.
- Tentukan kelas dengan nama, atribut, kelas dasar, dan ukuran pengemasan yang diberikan.
- Tentukan kelas dengan nama, atribut, kelas dasar, dan ukuran kelas yang diberikan secara keseluruhan.
- Tentukan kelas dengan nama, atribut, kelas dasar, ukuran kemasan, dan ukuran kelas yang diberikan secara keseluruhan.
Untuk membuat jenis array, jenis penunjuk, atau jenis byref untuk jenis yang tidak lengkap yang diwakili oleh TypeBuilder objek, gunakan MakeArrayType metode, MakePointerType metode, atau MakeByRefType metode.
Sebelum jenis digunakan, TypeBuilder.CreateType metode harus dipanggil. CreateType menyelesaikan pembuatan jenis. Setelah panggilan ke CreateType, pemanggil dapat membuat instans jenis dengan menggunakan Activator.CreateInstance metode , dan memanggil anggota jenis dengan menggunakan Type.InvokeMember metode . Ini adalah kesalahan untuk memanggil metode yang mengubah implementasi jenis setelah CreateType dipanggil. Misalnya, runtime bahasa umum melemparkan pengecualian jika pemanggil mencoba menambahkan anggota baru ke jenis.
Penginisialisasi kelas dibuat dengan menggunakan TypeBuilder.DefineTypeInitializer metode . DefineTypeInitializer mengembalikan ConstructorBuilder objek.
Jenis berlapis didefinisikan dengan memanggil salah TypeBuilder.DefineNestedType satu metode.
Atribut
Kelas TypeBuilder menggunakan TypeAttributes enumerasi untuk menentukan lebih lanjut karakteristik jenis yang akan dibuat:
- Antarmuka ditentukan menggunakan TypeAttributes.Interface atribut dan TypeAttributes.Abstract .
- Kelas konkret (kelas yang tidak dapat diperluas) ditentukan menggunakan TypeAttributes.Sealed atribut .
- Beberapa atribut menentukan visibilitas jenis. Lihat deskripsi TypeAttributes enumerasi.
- Jika TypeAttributes.SequentialLayout ditentukan, loader kelas menjabarkan bidang dalam urutan pembacaannya dari metadata. Pemuat kelas mempertimbangkan ukuran pengemasan yang ditentukan tetapi mengabaikan offset bidang yang ditentukan. Metadata mempertahankan urutan di mana definisi bidang dipancarkan. Bahkan di seluruh penggabungan, metadata tidak akan menyusun ulang definisi bidang. Loader akan mematuhi offset bidang yang ditentukan hanya jika TypeAttributes.ExplicitLayout ditentukan.
Masalah yang diketahui
- Pancaran pantulan tidak memverifikasi apakah kelas non-abstrak yang mengimplementasikan antarmuka telah menerapkan semua metode yang dideklarasikan dalam antarmuka. Namun, jika kelas tidak mengimplementasikan semua metode yang dideklarasikan dalam antarmuka, runtime tidak memuat kelas.
- Meskipun TypeBuilder berasal dari Type, beberapa metode abstrak yang ditentukan dalam Type kelas tidak sepenuhnya diimplementasikan di TypeBuilder kelas . Panggilan ke metode ini TypeBuilder melemparkan NotSupportedException pengecualian. Fungsionalitas yang diinginkan dapat diperoleh dengan mengambil jenis yang dibuat menggunakan Type.GetType atau Assembly.GetType dan mencerminkan pada jenis yang diambil.