Erweitern Minimieren
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original
Dieser Artikel wurde noch nicht bewertet - Dieses Thema bewerten.

Type.MakeGenericType-Methode

Ersetzt die Typparameter der aktuellen generischen Typdefinition durch die Elemente eines Arrays von Typen und gibt ein Type-Objekt zurück, das den resultierenden konstruierten Typ darstellt.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)
public virtual Type MakeGenericType(
	params Type[] typeArguments
)

Parameter

typeArguments
Typ: System.Type[]
Ein Array von Typen, die die Typparameter des aktuellen generischen Typs ersetzen sollen.

Rückgabewert

Typ: System.Type
Ein Type, der den konstruierten Typ darstellt, der durch Ersetzen der Typparameter des aktuellen generischen Typs durch die Elemente von typeArguments erstellt wurde.
AusnahmeBedingung
InvalidOperationException

Der aktuelle Typ stellt keine generische Typdefinition dar. Das heißt, IsGenericTypeDefinition gibt false zurück.

ArgumentNullException

typeArguments ist null.

- oder -

Eines der Elemente von typeArguments ist null.

ArgumentException

Die Anzahl von Elementen in typeArguments entspricht nicht der Anzahl von Typparametern in der aktuellen generischen Typdefinition.

- oder -

Eines der Elemente von typeArguments entspricht nicht den für den entsprechenden Typparameter des aktuellen generischen Typs angegebenen Einschränkungen.

- oder -

typeArguments enthält ein Element, das ein Zeigertyp (Type.IsPointer gibt true zurück), ein by-ref-Typ (Type.IsByRef gibt true zurück) oder Void ist.

NotSupportedException

Die aufgerufene Methode wird in der Basisklasse nicht unterstützt. Abgeleitete Klassen müssen eine Implementation angeben.

Mit der MakeGenericType-Methode können Sie Code verfassen, in dem den Typparametern einer generischen Typdefinition spezifische Typen zugewiesen werden, um auf diese Weise ein Type-Objekt zu erstellen, das einen bestimmten konstruierten Typ darstellt. Sie können dieses Type-Objekt verwenden, um Laufzeitinstanzen des konstruierten Typs zu erstellen.

Typen, die mit MakeGenericType konstruiert werden, können offen sein. Das heißt, dass einige ihrer Typargumente Typparameter von einschließenden generischen Methoden oder Typen sein können. Sie können solche offen konstruierte Typen z. B. verwenden, wenn Sie dynamische Assemblys ausgeben. Betrachten Sie als Beispiel die Base-Klasse und die Derived-Klasse im folgenden Code.


public class Base<T, U> { }
public class Derived<V> : Base<int, V> { }


Um Derived in einer dynamischen Assembly zu generieren, ist es notwendig, ihren Basistyp zu konstruieren. Rufen Sie hierzu die MakeGenericType-Methode mit einem Type-Objekt auf, das die Base-Klasse darstellt. Verwenden Sie die generischen Int32-Typargumente und den V-Typparameter von Derived. Da sowohl Typen als auch generische Typparameter durch Type-Objekte dargestellt werden, kann ein Array mit diesen beiden Objekten an die MakeGenericType-Methode übergeben werden.

HinweisHinweis

Ein konstruierter Typ wie Base<int, V> ist nützlich, wenn Sie Code ausgegeben, aber nicht die MakeGenericType-Methode in diesem Typ aufrufen können, weil es sich nicht um eine generische Typdefinition handelt. Um einen geschlossen konstruierten Typ zu erstellen, der instanziiert werden kann, rufen Sie zuerst die GetGenericTypeDefinition-Methode auf, um ein Type-Objekt zu erhalten, das die generische Typdefinition darstellt, und rufen Sie anschließend MakeGenericType mit den gewünschten Typargumenten auf.

Das von MakeGenericType zurückgegebene Type-Objekt entspricht dem Type, den Sie durch Aufrufen der GetType-Methode des resultierenden konstruierten Typs oder der GetType-Methode eines beliebigen konstruierten Typs erhalten, der aus derselben generischen Typdefinition mit denselben Typargumenten erstellt wurde.

HinweisHinweis

Ein Array von generischen Typen ist selbst kein generischer Typ. Sie können MakeGenericType nicht in einem Arraytyp wie C<T>[] (Dim ac() As C(Of T) in Visual Basic) aufrufen. Um aus C<T>[] einen geschlossenen generischen Typ zu konstruieren, rufen Sie GetElementType auf, um die generische Typdefinition C<T> abzurufen. Rufen Sie in der generischen Typdefinition MakeGenericType auf, um den konstruierten Typ zu erstellen. Abschließend rufen Sie die MakeArrayType-Methode im konstruierten Typ auf, um den Arraytyp zu erstellen. Dasselbe gilt für Zeigertypen und ref-Typen (ByRef in Visual Basic).

Eine Liste der unveränderlichen Bedingungen für allgemeine Begriffe, die in generischer Reflektion verwendet werden, finden Sie in den Hinweisen zur IsGenericType-Eigenschaft.

Geschachtelte Typen

Wenn ein generischer Typ mit C#, C++ oder Visual Basic definiert wird, sind seine sämtlichen geschachtelten Typen generisch. Dies gilt auch, wenn die geschachtelten Typen über keine eigenen Typparameter verfügen, da alle drei Sprachen die Typparameter des einschließenden Typs in die Typparameterliste des geschachtelten Typs einfügen. Betrachten Sie folgenden Klassen:


public class Outermost<T>
{
    public class Inner<U>
    {
        public class Innermost1<V> {}
        public class Innermost2 {}
    }
}


Die Typparameterliste der geschachtelten Inner-Klasse verfügt über die beiden Parameter T und U, von denen der erste der Typparameter seiner einschließenden Klasse ist. Entsprechend verfügt die Typparameterliste der geschachtelten Innermost1-Klasse über die drei Typparameter T, U und V, wobei T und U aus den einschließenden Klassen stammen. Die geschachtelte Innermost2-Klasse verfügt über die beiden Typparameter T und U, die aus den einschließenden Klassen stammen.

Wenn die Parameterliste des einschließenden Typs über mehrere Typparameter verfügt, werden alle Typparameter in die Typparameterliste des geschachtelten Typs eingefügt.

Um einen generischen Typ aus der generischen Typdefinition für einen geschachtelten Typ zu konstruieren, rufen Sie die MakeGenericType-Methode mit dem Array auf, das durch Verketten der Typargumentarrays aller einschließenden Typen gebildet wird. Beginnen Sie bei der Verkettung mit dem äußersten generischen Typ, und enden Sie mit dem geschachtelten Typ, sofern dieser selbst über Typparameter verfügt. Um eine Instanz von Innermost1 zu erstellen, rufen Sie die MakeGenericType-Methode mit einem Array auf, das drei Typen enthält, um T, U und V zugewiesen zu werden. Um eine Instanz von Innermost2 zu erstellen, rufen Sie die MakeGenericType-Methode mit einem Array auf, das zwei Typen enthält, um T und U zugewiesen zu werden.

Die Sprachen geben die Typparameter der einschließenden Typen auf diese Weise weiter, sodass Sie die Typparameter eines einschließenden Typs für das Definieren von Feldern des geschachtelten Typs verwenden können. Andernfalls lägen die Typparameter nicht im Gültigkeitsbereich des Textes von geschachtelten Typen. Sie können geschachtelte Typen definieren, ohne die Typparameter des einschließenden Typs weiterzugeben, indem Sie Code in dynamischen Assemblys ausgeben oder den Ilasm.exe (MSIL-Assembler) verwenden. Betrachten Sie den folgenden Code für den MSIL-Assembler:

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

In diesem Beispiel ist es nicht möglich, ein Feld vom Typ T oder U in der Innermost-Klasse zu definieren, da diese Typparameter nicht im Gültigkeitsbereich liegen. Der folgende Assemblercode definiert geschachtelte Klassen, die sich wie bei der Definition in C++, Visual Basic oder C# verhalten:

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

Sie können mit dem Ildasm.exe (MSIL Disassembler-Tool) die in den Hochsprachen definierten geschachtelten Klassen und dieses Benennungsschema untersuchen.

Im folgenden Beispiel wird mit der MakeGenericType-Methode ein konstruierter Typ aus der generischen Typdefinition für den Dictionary<TKey, TValue>-Typ erstellt. Der konstruierte Typ stellt ein Dictionary<TKey, TValue> von Test-Objekten mit Zeichenfolgenschlüsseln dar.


using System;
using System.Reflection;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        Console.WriteLine("\r\n--- Create a constructed type from the generic Dictionary type.");

        // Create a type object representing the generic Dictionary 
        // type, by omitting the type arguments (but keeping the 
        // comma that separates them, so the compiler can infer the
        // number of type parameters).      
        Type generic = typeof(Dictionary<,>);
        DisplayTypeInfo(generic);

        // Create an array of types to substitute for the type
        // parameters of Dictionary. The key is of type string, and
        // the type to be contained in the Dictionary is Test.
        Type[] typeArgs = { typeof(string), typeof(Test) };

        // Create a Type object representing the constructed generic
        // type.
        Type constructed = generic.MakeGenericType(typeArgs);
        DisplayTypeInfo(constructed);

        // Compare the type objects obtained above to type objects
        // obtained using typeof() and GetGenericTypeDefinition().
        Console.WriteLine("\r\n--- Compare types obtained by different methods:");

        Type t = typeof(Dictionary<String, Test>);
        Console.WriteLine("\tAre the constructed types equal? {0}", t == constructed);
        Console.WriteLine("\tAre the generic types equal? {0}", 
            t.GetGenericTypeDefinition() == generic);
    }

    private static void DisplayTypeInfo(Type t)
    {
        Console.WriteLine("\r\n{0}", t);

        Console.WriteLine("\tIs this a generic type definition? {0}", 
            t.IsGenericTypeDefinition);

        Console.WriteLine("\tIs it a generic type? {0}", 
            t.IsGenericType);

        Type[] typeArguments = t.GetGenericArguments();
        Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
        foreach (Type tParam in typeArguments)
        {
            Console.WriteLine("\t\t{0}", tParam);
        }
    }
}

/* This example produces the following output:

--- Create a constructed type from the generic Dictionary type.

System.Collections.Generic.Dictionary`2[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey
                TValue

System.Collections.Generic.Dictionary`2[System.String, Test]
        Is this a generic type definition? False
        Is it a generic type? True
        List type arguments (2):
                System.String
                Test

--- Compare types obtained by different methods:
        Are the constructed types equal? True
        Are the generic types equal? True
 */


.NET Framework

Unterstützt in: 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)

Community-Beiträge

HINZUFÜGEN
Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
© 2013 Microsoft. Alle Rechte vorbehalten.