Aracılığıyla paylaş


System.Type.MakeGenericType yöntemi

Uyarı

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.

MakeGenericType ile oluşturulan türler açık türler olabilir; başka bir ifadeyle, bağımsız tür argümanlarından bazıları, genel yöntemleri veya türleri kapsayanın tür parametreleri olabilir. Dinamik derlemeler yayarken bu tür açık oluşturulmuş türleri kullanabilirsiniz. Örneğin, aşağıdaki kodda Base ve Derived sınıflarını 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 Derived oluşturmak için, temel türünü inşa etmek gereklidir. Bunu yapmak için, MakeGenericType nesnesinde, sınıf Type'yi temsil eden, Base genel tür bağımsız değişkenlerini ve Int32'den V tür parametresini kullanarak Derived yöntemini çağırın. Türler ve genel tür parametreleri Type nesneler tarafından temsil edildiğinden, her ikisini içeren bir dizi MakeGenericType yöntemine geçirilebilir.

Uyarı

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

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

Uyarı

Genel türlerden oluşan bir dizi, genel bir tür değildir. ( Visual Basic'te) gibi MakeGenericTypeC<T>[] bir dizi türünde çağrı Dim ac() As C(Of T) yapamazsınız. C<T>[]'den kapalı bir genel tür oluşturmak için, GetElementType'i çağırarak genel tür tanımını C<T>'den alın; oluşturulmuş türü yaratmak için genel tür tanımında MakeGenericType'ü çağırın ve son olarak dizi türünü oluşturmak için oluşturulan türdeki MakeArrayType yöntemini çağırın. İş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 listesi, T, U ve V olmak üzere üç tür parametresi barındırır; T ve U ise kapsayan sınıflardan gelmektedir. İç içe geçmiş sınıf Innermost2, kapsayan sınıflarından gelen T ve U olmak üzere iki 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.

MakeGenericType yöntemini çağırmak için, iç içe bir türün genel tür tanımından genel bir tür oluştururken, en dıştaki genel türden başlayarak tüm kapsayan türlerin tür bağımsız değişken dizilerini birleştirin ve eğer kendi tür parametreleri varsa, iç içe türün tür bağımsız değişken dizisini ekleyin. ö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 kullanabilmenizi sağlamak amacıyla, kapsayan türlerin tür parametrelerini bu şekilde yayar. Aksi takdirde, tür parametreleri iç içe türlerin gövdeleri içinde kapsamda bulunmaz. İç içe türleri, kapsayan türlerin tür parametrelerini yaymadan, kodu dinamik derlemelerde ya da 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.