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.
Nota
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 metode ModuleBuilder.DefineType, yang mengembalikan objek TypeBuilder.
Reflection emit menyediakan opsi berikut untuk mendefinisikan tipe:
- 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 keseluruhan kelas yang ditentukan.
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 tipe digunakan, metode TypeBuilder.CreateType 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, waktu proses bahasa umum menghasilkan pengecualian jika pemanggil mencoba menambahkan anggota baru ke sebuah jenis.
Penginisialisasi kelas dibuat dengan menggunakan TypeBuilder.DefineTypeInitializer metode . DefineTypeInitializer mengembalikan ConstructorBuilder objek.
Jenis berlapis didefinisikan dengan memanggil salah TypeBuilder.DefineNestedType satu metode.
Atributs
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 tipe. Lihat deskripsi TypeAttributes enumerasi.
- Jika TypeAttributes.SequentialLayout ditentukan, pemuat kelas mengatur bidang dalam urutan pembacaan 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 hanya akan mematuhi offset bidang yang ditentukan 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-metode ini TypeBuilder akan memicu NotSupportedException pengecualian. Fungsionalitas yang diinginkan dapat diperoleh dengan mengambil tipe yang dibuat melalui Type.GetType atau Assembly.GetType dan merefleksikan pada tipe yang diambil.