Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
Met MakeGenericType de methode kunt u code schrijven waarmee specifieke typen worden toegewezen aan de typeparameters van een algemene typedefinitie, waardoor u een Type object maakt dat een bepaald samengesteld type vertegenwoordigt. U kunt dit Type object gebruiken om runtime-exemplaren van het samengestelde type te maken.
Typen die zijn samengesteld met MakeGenericType kunnen open zijn, dat wil gezegd, sommige van hun typeargumenten kunnen parameters zijn van het insluiten van algemene methoden of typen. U kunt dergelijke open samengestelde typen gebruiken wanneer u dynamische assemblages uitvoert. Denk bijvoorbeeld aan de klassen Base en Derived in de volgende code.
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
Voor het genereren Derived in een dynamische assembly is het noodzakelijk om het basistype te maken. Hiervoor roept u de MakeGenericType methode aan voor een Type object dat de klasse Basevertegenwoordigt, met behulp van de algemene typeargumenten Int32 en de typeparameter V van Derived. Omdat typen en algemene typeparameters beide worden vertegenwoordigd door Type objecten, kan een matrix met beide worden doorgegeven aan de MakeGenericType methode.
Opmerking
Een samengesteld type, zoals Base<int, V> handig bij het verzenden van code, maar u kunt de MakeGenericType methode voor dit type niet aanroepen omdat het geen algemene typedefinitie is. Als u een gesloten samengesteld type wilt maken dat kan worden geïnstantieerd, roept u eerst de GetGenericTypeDefinition methode aan om een Type object op te halen dat de algemene typedefinitie vertegenwoordigt en roept u vervolgens MakeGenericType aan met de gewenste typeargumenten.
Het Type object dat wordt MakeGenericType geretourneerd door is hetzelfde als het Type object dat is verkregen door de GetType methode van het resulterende samengestelde type aan te roepen, of de GetType methode van elk samengesteld type dat is gemaakt op basis van dezelfde algemene typedefinitie met dezelfde typeargumenten.
Opmerking
Een matrix van algemene typen is zelf geen algemeen type. U kunt MakeGenericType niet aanroepen op een arraytype zoals C<T>[] (Dim ac() As C(Of T) in Visual Basic). Als u een gesloten generiek type wilt maken van C<T>[], roept u GetElementType aan om de generieke typedefinitie C<T> te verkrijgen. Roep MakeGenericType aan op de generieke typedefinitie om het geconstrueerde type te maken; en roep ten slotte de MakeArrayType-methode aan op het geconstrueerde type om het matrixtype te maken. Hetzelfde geldt voor aanwijzertypen en ref -typen (ByRef in Visual Basic).
Zie de opmerkingen van de IsGenericType eigenschap voor een lijst met invariante voorwaarden voor termen die in generieke reflectie worden gebruikt.
Geneste typen
Als een algemeen type is gedefinieerd met C#, C++of Visual Basic, zijn de geneste typen allemaal algemeen. Dit geldt zelfs als de geneste typen geen eigen typeparameters hebben, omdat alle drie de talen de typeparameters bevatten van het insluiten van typen in de typeparameterlijsten van geneste typen. Houd rekening met de volgende klassen:
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
De typeparameterlijst van de geneste klasse Inner heeft twee typeparameters T en U, waarvan de eerste de typeparameter van de bijbehorende klasse is. Op dezelfde manier heeft de typeparameterlijst van de geneste klasse Innermost1 drie typeparameters, T, U, en V, waarbij T en U afkomstig zijn van zijn omliggende klassen. De geneste klasse Innermost2 heeft twee typeparameters en TU, die afkomstig zijn van de ingesloten klassen.
Als de lijst met parameters van het insluittype meer dan één typeparameter heeft, worden alle typeparameters in volgorde opgenomen in de lijst met typeparameters van het geneste type.
Als u een generiek type wilt samenstellen vanuit de generieke typedefinitie voor een genest type, roept u de MakeGenericType-methode aan met de array die is gevormd door het samenvoegen van de typeargumentarrays van alle omsluitende typen, te beginnen met het buitenste generieke type en te eindigen met de typeargumentarray van het geneste type zelf, als het typeparameters voor zichzelf heeft. Als u een instantie van Innermost1wilt maken, roept u de MakeGenericType methode aan met een matrix met drie typen, die moet worden toegewezen aan T, U en V. Als u een instantie van Innermost2wilt maken, roept u de MakeGenericType methode aan met een matrix die twee typen bevat, die moet worden toegewezen aan T en U.
De talen geven de typeparameters van het insluiten van typen op deze manier door, zodat u de typeparameters van een omsluittype kunt gebruiken om velden van geneste typen te definiëren. Anders zouden de typeparameters niet in scope zijn binnen de omschrijvingen van de geneste typen. Het is mogelijk om geneste typen te definiëren zonder de typeparameters van omsluittypen door code in dynamische assembly's te verzenden of door de Ilasm.exe (IL Assemblyer) te gebruiken. Houd rekening met de volgende code voor de CIL-assembly:
.class public Outer<T> {
.class nested public Inner<U> {
.class nested public Innermost {
}
}
}
In dit voorbeeld is het niet mogelijk om een veld van het type T of U in klasse Innermostte definiëren, omdat deze typeparameters niet binnen het bereik vallen. Met de volgende assemblyercode worden geneste klassen gedefinieerd die zich gedragen zoals ze zouden worden gedefinieerd in C++, Visual Basic en C#:
.class public Outer<T> {
.class nested public Inner<T, U> {
.class nested public Innermost<T, U, V> {
}
}
}
U kunt de Ildasm.exe (IL Disassembler) gebruiken om geneste klassen te onderzoeken die zijn gedefinieerd in de talen op hoog niveau en dit naamgevingsschema te observeren.