Metode System.Type.MakeGenericType

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Metode ini MakeGenericType memungkinkan Anda menulis kode yang menetapkan jenis tertentu ke parameter jenis definisi jenis generik, sehingga membuat Type objek yang mewakili jenis konstruksi tertentu. Anda dapat menggunakan objek ini Type untuk membuat instans run-time dari jenis yang dibangun.

Jenis yang dibangun dengan MakeGenericType dapat terbuka, yaitu, beberapa argumen jenisnya dapat berupa parameter jenis metode atau jenis generik. Anda dapat menggunakan jenis konstruksi terbuka tersebut saat memancarkan rakitan dinamis. Misalnya, pertimbangkan kelas Base dan Derived dalam kode berikut.

public class Base<T, U> { }
public class Derived<V> : Base<int, V> { }
type Base<'T, 'U>() = class end
type Derived<'V>() = inherit Base<int, 'V>()
Public Class Base(Of T, U)
End Class
Public Class Derived(Of V)
    Inherits Base(Of Integer, V)
End Class

Untuk menghasilkan Derived dalam rakitan dinamis, perlu untuk membangun jenis dasarnya. Untuk melakukan ini, panggil MakeGenericType metode pada objek yang Type mewakili kelas Base, menggunakan argumen Int32 jenis generik dan parameter V jenis dari Derived. Karena parameter jenis dan jenis generik keduanya diwakili oleh Type objek, array yang berisi keduanya dapat diteruskan ke MakeGenericType metode .

Catatan

Jenis yang dibangun seperti Base<int, V> berguna saat memancarkan kode, tetapi Anda tidak dapat memanggil MakeGenericType metode pada jenis ini karena bukan definisi jenis generik. Untuk membuat jenis konstruksi tertutup yang dapat diinstruksikan, pertama-tama panggil GetGenericTypeDefinition metode untuk mendapatkan objek yang Type mewakili definisi jenis generik lalu panggil MakeGenericType dengan argumen jenis yang diinginkan.

Objek Type yang dikembalikan oleh sama Type dengan MakeGenericType yang diperoleh dengan memanggil GetType metode dari jenis konstruksi yang dihasilkan, atau GetType metode dari jenis yang dibuat yang dibuat dari definisi jenis generik yang sama menggunakan argumen jenis yang sama.

Catatan

Array jenis generik bukan tipe generik. Anda tidak dapat memanggil MakeGenericType pada jenis array seperti C<T>[] (Dim ac() As C(Of T) di Visual Basic). Untuk membuat jenis generik tertutup dari C<T>[], panggil GetElementType untuk mendapatkan definisi C<T>jenis generik ; panggil MakeGenericType definisi jenis generik untuk membuat jenis yang dibangun; dan akhirnya memanggil MakeArrayType metode pada jenis yang dibangun untuk membuat jenis array. Hal yang sama berlaku untuk jenis dan ref jenis penunjuk (ByRef di Visual Basic).

Untuk daftar kondisi invarian bagi istilah yang digunakan dalam refleksi generik, lihat keterangan properti IsGenericType.

Jenis Berlapis

Jika jenis generik didefinisikan menggunakan C#, C++, atau Visual Basic, maka jenis berlapisnya semuanya umum. Ini berlaku bahkan jika jenis berlapis tidak memiliki parameter jenisnya sendiri, karena ketiga bahasa tersebut mencakup parameter jenis jenis yang diapit dalam daftar parameter jenis berlapis. Pertimbangkan kelas berikut:

public class Outermost<T>
{
    public class Inner<U>
    {
        public class Innermost1<V> {}
        public class Innermost2 {}
    }
}
Public Class Outermost(Of T)
    Public Class Inner(Of U)
        Public Class Innermost1(Of V)
        End Class
        Public Class Innermost2
        End Class
    End Class
End Class

Daftar parameter jenis kelas Inner berlapis memiliki dua parameter jenis, T dan U, yang pertama adalah parameter jenis kelas penutupnya. Demikian pula, daftar parameter jenis kelas Innermost1 berlapis memiliki tiga parameter jenis, T, , Udan V, dengan T dan U berasal dari kelas penutupnya. Kelas berlapis Innermost2 memiliki dua parameter jenis, T dan U, yang berasal dari kelas penutupnya.

Jika daftar parameter jenis penutup memiliki lebih dari satu parameter jenis, semua parameter jenis secara berurutan disertakan dalam daftar parameter jenis jenis jenis berlapis.

Untuk membuat jenis generik dari definisi jenis generik untuk jenis berlapis, panggil MakeGenericType metode dengan array yang dibentuk dengan menggabungkan array argumen jenis dari semua jenis penutup, dimulai dengan jenis generik terluar, dan diakhiri dengan array argumen jenis dari jenis berlapis itu sendiri, jika memiliki parameter jenis sendiri. Untuk membuat instans Innermost1, panggil MakeGenericType metode dengan array yang berisi tiga jenis, untuk ditetapkan ke T, U, dan V. Untuk membuat instans Innermost2, panggil MakeGenericType metode dengan array yang berisi dua jenis, untuk ditetapkan ke T dan U.

Bahasa menyebarluaskan parameter jenis jenis yang diapit dalam mode ini sehingga Anda dapat menggunakan parameter jenis jenis yang diapit untuk menentukan bidang jenis berlapis. Jika tidak, parameter jenis tidak akan berada dalam cakupan dalam badan jenis berlapis. Dimungkinkan untuk menentukan jenis berlapis tanpa menyebarkan parameter jenis jenis enclosing, dengan memancarkan kode dalam rakitan dinamis atau dengan menggunakan Ilasm.exe (IL Assembler). Pertimbangkan kode berikut untuk perakitan CIL:

.class public Outer<T> {
    .class nested public Inner<U> {
        .class nested public Innermost {
        }
    }
}

Dalam contoh ini, tidak dimungkinkan untuk menentukan bidang jenis T atau U di kelas Innermost, karena parameter jenis tersebut tidak berada dalam cakupan. Kode perakit berikut mendefinisikan kelas berlapis yang bertindak seperti yang mereka lakukan jika didefinisikan dalam C++, Visual Basic, dan C#:

.class public Outer<T> {
    .class nested public Inner<T, U> {
        .class nested public Innermost<T, U, V> {
        }
    }
}

Anda dapat menggunakan Ildasm.exe (IL Disassembler) untuk memeriksa kelas berlapis yang ditentukan dalam bahasa tingkat tinggi dan mengamati skema penamaan ini.