System.Type.MakeGenericType yöntemi

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

yöntemi, MakeGenericType genel tür tanımının tür parametrelerine belirli türler atayan kod yazmanıza olanak tanır, böylece belirli bir yapı türünü temsil eden bir Type nesne oluşturur. Bu Type nesneyi, oluşturduğunuz türün çalışma zamanı örneklerini oluşturmak için kullanabilirsiniz.

ile MakeGenericType yapılan türler açık olabilir; diğer bir ifadeyle, tür bağımsız değişkenlerinden bazıları genel yöntemleri veya türleri kapsayan tür parametreleri olabilir. Dinamik derlemeler yayarken bu tür açık oluşturulmuş türleri kullanabilirsiniz. Örneğin, aşağıdaki kodda ve Derived sınıflarını Base göz önünde bulundurun.

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

Dinamik bir derlemede oluşturmak Derived için temel türünü oluşturmak gerekir. Bunu yapmak için, genel tür bağımsız değişkenlerini Int32 ve öğesinden tür parametresini V kullanarak sınıfını Basetemsil eden bir Type nesnede yöntemini çağırınDerivedMakeGenericType. Türler ve genel tür parametreleri nesneler tarafından Type temsil edildiğinden, her ikisini de içeren bir dizi yöntemine MakeGenericType geçirilebilir.

Not

gibi Base<int, V> bir tür kod yayarken yararlıdır, ancak genel tür tanımı olmadığından bu türdeki yöntemini çağıramazsınız MakeGenericType . Örneği oluşturulabilen kapalı bir yapılı tür oluşturmak için, önce yöntemini çağırarak GetGenericTypeDefinition genel tür tanımını temsil eden bir Type nesne alın ve ardından istenen tür bağımsız değişkenleriyle çağırın MakeGenericType .

Type tarafından MakeGenericType döndürülen nesnesi, elde edilen oluşturulan türün GetType yöntemini veya GetType aynı tür bağımsız değişkenleri kullanılarak aynı genel tür tanımından oluşturulan herhangi bir oluşturulmuş türün yöntemini çağırarak elde edilen ile aynıdırType.

Not

Genel türlerden oluşan bir dizi, genel bir tür değildir. ( Visual Basic'te) gibi C<T>[]Dim ac() As C(Of T) bir dizi türünde çağrı MakeGenericType yapamazsınız. 'den C<T>[]kapalı bir genel tür oluşturmak için, genel tür tanımını C<T>almak için öğesini çağırınGetElementType; genel tür tanımında çağrısı MakeGenericType yapıp, oluşturulacak türü oluşturun ve son olarak da dizi türünü oluşturmak için yapısının üzerindeki yöntemini çağırınMakeArrayType. İşaretçi türleri ve ref türleri için de aynı durum geçerlidir (ByRef Visual Basic'te).

Genel yansımada kullanılan terimlere ilişkin sabit koşulların IsGenericType listesi için özellik açıklamalarına bakın.

İç içe geçmiş türler

Genel bir tür C#, C++ veya Visual Basic kullanılarak tanımlanmışsa, iç içe türlerin tümü geneldir. İç içe türlerin kendi tür parametreleri olmasa bile bu durum geçerlidir, çünkü üç dil de iç içe türlerin tür parametre listelerinde kapsayan türlerin tür parametrelerini içerir. Aşağıdaki sınıfları göz önünde bulundurun:

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

İç içe sınıfın Inner tür parametre listesinde iki tür parametresi T vardır ve Ubunlardan ilki, kapsayan sınıfının tür parametresidir. Benzer şekilde, iç içe sınıfın Innermost1 tür parametre listesinde, ile ve kapsayan sınıflardan gelen üç tür parametresi Tvardır: , U, ve VTU . İç içe geçmiş sınıfın Innermost2 , T kapsayan sınıflarından gelen ve Uiki tür parametresi vardır.

Kapsayan türün parametre listesinde birden fazla tür parametresi varsa, sırasıyla tüm tür parametreleri iç içe türün tür parametre listesine eklenir.

İç içe bir türün genel tür tanımından genel bir tür oluşturmak için, en dıştaki genel türle başlayıp kendi tür parametrelerine sahipse iç içe türün tür bağımsız değişken dizisiyle biten, tüm kapsayan türlerin tür bağımsız değişken dizilerini bir araya getirmek suretiyle oluşturulan diziyle yöntemini çağırın MakeGenericType . örneğini Innermost1oluşturmak için T, U ve V'ye atanacak üç tür içeren bir dizi ile yöntemini çağırın MakeGenericType . örneğini Innermost2oluşturmak için, T ve U'ya atanacak iki tür içeren bir dizi ile yöntemini çağırın MakeGenericType .

Diller, iç içe türlerin alanlarını tanımlamak için bir kapsayan türün tür parametrelerini kullanabilmeniz için, kapsayan türlerin tür parametrelerini bu şekilde yayılır. Aksi takdirde, tür parametreleri iç içe türlerin gövdeleri içinde kapsam içinde olmaz. İç içe türleri kapsayan türlerin tür parametrelerini yaymadan, dinamik derlemelerde kod yayarak veya Ilasm.exe (IL Assembler) kullanarak tanımlamak mümkündür. CIL derleyicisi için aşağıdaki kodu göz önünde bulundurun:

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

Bu örnekte, türünde T veya U sınıfında Innermostbir alan tanımlamak mümkün değildir çünkü bu tür parametreleri kapsam içinde değildir. Aşağıdaki derleyici kodu C++, Visual Basic ve C# içinde tanımlandığında olduğu gibi davranan iç içe sınıfları tanımlar:

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

üst düzey dillerde tanımlanan iç içe sınıfları incelemek ve bu adlandırma düzenini gözlemlemek için Ildasm.exe (IL Disassembler) kullanabilirsiniz.