Reflektion und generische TypenReflection and Generic Types

Aus Sicht der Reflektion besteht der Unterschied zwischen einem generischen und einem normalen Typ darin, dass ein generischer Typ mit einem Typparameterset (bei einer generischen Typdefinition) oder mit Typargumenten (bei einem konstruierten Typ) verknüpft ist.From the point of view of reflection, the difference between a generic type and an ordinary type is that a generic type has associated with it a set of type parameters (if it is a generic type definition) or type arguments (if it is a constructed type). Auf dieselbe Art unterscheidet sich eine generische Methode von einer normalen Methode.A generic method differs from an ordinary method in the same way.

Es gibt zwei wichtige Schlüssel für das Verständnis des Umgangs von Reflektion mit generischen Typen und Methoden:There are two keys to understanding how reflection handles generic types and methods:

  • Die Typparameter der generischen Typdefinitionen und generischen Methodendefinitionen werden durch Instanzen der Type -Klasse dargestellt.The type parameters of generic type definitions and generic method definitions are represented by instances of the Type class.

    Hinweis

    Viele Eigenschaften und Methoden des Type -Objekts weisen ein anderes Verhalten auf, wenn ein Type -Objekt einen generischen Typparameter darstellt.Many properties and methods of Type have different behavior when a Type object represents a generic type parameter. Diese Unterschiede werden in den Themen zu Eigenschaften und Methoden erläutert.These differences are documented in the property and method topics. Beispielsweise unter IsAutoClass und DeclaringType.For example, see IsAutoClass and DeclaringType. Darüber hinaus sind einige Member nur gültig, wenn ein Type -Objekt einen generischen Typparameter darstellt.In addition, some members are valid only when a Type object represents a generic type parameter. Ein Beispiel finden Sie unter GetGenericTypeDefinition.For example, see GetGenericTypeDefinition.

  • Wenn eine Instanz des Type -Objekts einen generischen Typ darstellt, enthält es ein Array von Typen, das die Typparameter (bei generischen Typdefinitionen) oder die Typargumente (bei konstruierten Typen) darstellt.If an instance of Type represents a generic type, then it includes an array of types that represent the type parameters (for generic type definitions) or the type arguments (for constructed types). Gilt auch für eine Instanz der MethodInfo -Klasse, die eine generische Methode darstellt.The same is true of an instance of the MethodInfo class that represents a generic method.

Reflektion stellt Type- und MethodInfo-Methoden bereit, mit denen Sie auf das Array von Typparametern zugreifen und ermitteln können, ob eine Type-Instanz einen Typparameter oder einen tatsächlichen Typ darstellt.Reflection provides methods of Type and MethodInfo that allow you to access the array of type parameters, and to determine whether an instance of Type represents a type parameter or an actual type.

Ein Codebeispiel zur Erläuterung der hier dargestellten Methoden finden Sie unter How to: Examine and Instantiate Generic Types with Reflection (Vorgehensweise: Erkennen und Bearbeiten von generischen Typen).For example code demonstrating the methods discussed here, see How to: Examine and Instantiate Generic Types with Reflection.

Bei der folgenden Erläuterung wird davon ausgegangen, dass Sie mit der Terminologie von Generics vertraut sind, d. h. Sie kennen beispielsweise den Unterschied zwischen Typparametern und Typargumenten sowie zwischen offenen und geschlossenen konstruierten Typen.The following discussion assumes familiarity with the terminology of generics, such as the difference between type parameters and arguments and open or closed constructed types. Weitere Informationen finden Sie unter Generics.For more information, see Generics.

Diese Übersicht enthält folgende Abschnitte:This overview consists of the following sections:

Ist dies ein generischer Typ oder eine generische Methode?Is This a Generic Type or Method?

Verwenden Sie beim Überprüfen eines unbekannten durch eine Instanz der Type-Klasse dargestellten Typs die IsGenericType -Eigenschaft, um zu ermitteln, ob es sich beim unbekannten Typ um einen generischen Typ handelt.When you use reflection to examine an unknown type, represented by an instance of Type, use the IsGenericType property to determine whether the unknown type is generic. Die Eigenschaft gibt true zurück, wenn es sich um einen generischen Typ handelt.It returns true if the type is generic. Verwenden Sie dementsprechend beim Überprüfen einer unbekannten durch eine Instanz der MethodInfo -Klasse dargestellten Methode die IsGenericMethod -Eigenschaft, um zu ermitteln, ob es sich bei der unbekannten Methode um eine generische Methode handelt.Similarly, when you examine an unknown method, represented by an instance of the MethodInfo class, use the IsGenericMethod property to determine whether the method is generic.

Ist dies eine generische Typ- oder Methodendefinition?Is This a Generic Type or Method Definition?

Mit der IsGenericTypeDefinition -Eigenschaft können Sie bestimmen, ob ein Type -Objekt eine generische Typdefinition darstellt, und mit der IsGenericMethodDefinition -Methode, ob ein MethodInfo -Objekt eine generische Methodendefinition darstellt.Use the IsGenericTypeDefinition property to determine whether a Type object represents a generic type definition, and use the IsGenericMethodDefinition method to determine whether a MethodInfo represents a generic method definition.

Generische Typ- und Methodendefinitionen sind Vorlagen, aus denen instanziierbare Typen erstellt werden.Generic type and method definitions are the templates from which instantiable types are created. Generische Typen in der .NET Framework-Klassenbibliothek wie Dictionary<TKey,TValue>sind generische Typdefinitionen.Generic types in the .NET Framework class library, such as Dictionary<TKey,TValue>, are generic type definitions.

Ist der Typ bzw. die Methode offen oder geschlossen?Is the Type or Method Open or Closed?

Ein generischer Typ oder eine generische Methode ist geschlossen, wenn alle Typparameter, u. a. Typparameter aller einschließenden Typen durch instanziierbare Typen ersetzt wurden.A generic type or method is closed if instantiable types have been substituted for all its type parameters, including all the type parameters of all enclosing types. Sie können nur eine Instanz eines generischen Typs erstellen, wenn er geschlossen ist.You can only create an instance of a generic type if it is closed. Die Type.ContainsGenericParameters -Eigenschaft gibt true zurück, wenn ein Typ offen ist.The Type.ContainsGenericParameters property returns true if a type is open. Bei Methoden erfüllt die MethodBase.ContainsGenericParameters -Methode die gleiche Funktion.For methods, the MethodBase.ContainsGenericParameters method performs the same function.

Zurück zum AnfangBack to top

Generieren geschlossener generischer TypenGenerating Closed Generic Types

Wenn Sie bereits über eine generische Typ- oder Methodendefinition verfügen, können Sie mit der MakeGenericType -Methode einen geschlossenen generischen Typ erstellen oder mit der MakeGenericMethod -Methode ein MethodInfo -Objekt für eine geschlossene generische Methode erstellen.Once you have a generic type or method definition, use the MakeGenericType method to create a closed generic type or the MakeGenericMethod method to create a MethodInfo for a closed generic method.

Abrufen der generischen Typ- bzw. MethodendefinitionGetting the Generic Type or Method Definition

Wenn Sie über einen offenen generischen Typ- bzw. eine offene generische Methode verfügen, die keine generische Typ- bzw. Methodendefinition ist, können Sie keine Instanzen davon erstellen und keine fehlenden Typparameter bereitstellen.If you have an open generic type or method that is not a generic type or method definition, you cannot create instances of it and you cannot supply the type parameters that are missing. Sie müssen über eine generische Typ- oder Methodendefinition verfügen.You must have a generic type or method definition. Verwenden Sie zum Abrufen der generischen Typdefinition die GetGenericTypeDefinition -Methode oder die GetGenericMethodDefinition -Methode zum Abrufen der generischen Methodendefinition.Use the GetGenericTypeDefinition method to obtain the generic type definition or the GetGenericMethodDefinition method to obtain the generic method definition.

Wenn Sie über ein Type -Objekt verfügen, das ein Dictionary<int, string> -Objekt (Dictionary(Of Integer, String) in Visual Basic) darstellt und den Dictionary<string, MyClass>-Typ erstellen möchten, können Sie mit der GetGenericTypeDefinition -Methode ein Type -Objekt abrufen, das Dictionary<TKey, TValue> darstellt, und dann mit der MakeGenericType -Methode ein Type -Objekt erstellen, das Dictionary<int, MyClass>darstellt.For example, if you have a Type object representing Dictionary<int, string> (Dictionary(Of Integer, String) in Visual Basic) and you want to create the type Dictionary<string, MyClass>, you can use the GetGenericTypeDefinition method to get a Type representing Dictionary<TKey, TValue> and then use the MakeGenericType method to produce a Type representing Dictionary<int, MyClass>.

Ein Beispiel für einen offenen generischen Typ, der kein generischer Typ ist, finden Sie unter „Typparameter oder Typargument“ im weiteren Verlauf dieses Themas.For an example of an open generic type that is not a generic type, see "Type Parameter or Type Argument" later in this topic.

Zurück zum AnfangBack to top

Überprüfen von Typargumenten und TypparameternExamining Type Arguments and Type Parameters

Verwenden Sie zum Abrufen eines Arrays von Type.GetGenericArguments -Objekten, das die Typparameter oder Typargumente eines generischen Typs darstellt, die Type -Methode und die MethodInfo.GetGenericArguments -Methode, um diesen Vorgang für eine generische Methode auszuführen.Use the Type.GetGenericArguments method to obtain an array of Type objects that represent the type parameters or type arguments of a generic type, and use the MethodInfo.GetGenericArguments method to do the same for a generic method.

Wenn Sie wissen, das ein Type -Objekt einen Typparameter darstellt, kann Reflektion eine Antwort auf viele weitere Fragen bieten.Once you know that a Type object represents a type parameter, there are many additional questions reflection can answer. Sie können die Quelle, Position und Einschränkungen des Typparameters bestimmen.You can determine the type parameter's source, its position, and its constraints.

Typparameter oder TypargumentType Parameter or Type Argument

Verwenden Sie die IsGenericParameter -Eigenschaft zum Bestimmen, ob ein bestimmtes Element des Arrays ein Typparameter oder Typargument ist.To determine whether a particular element of the array is a type parameter or a type argument, use the IsGenericParameter property. Die IsGenericParameter -Eigenschaft ist true , wenn das Element ein Typparameter ist.The IsGenericParameter property is true if the element is a type parameter.

Bei einem generischen Typ kann es sich auch um einen offenen Typ handeln, wenn dieser keine generische Typdefinition ist. In diesem Fall verfügt er über eine Mischung aus Typargumenten und Typparametern.A generic type can be open without being a generic type definition, in which case it has a mixture of type arguments and type parameters. Im folgenden Code leitet sich beispielsweise die D -Klasse von einem Typ ab, der durch das Ersetzen des zweiten Typparameters von D mit dem ersten Typparameter von Berstellt wurde.For example, in the following code, class D derives from a type created by substituting the first type parameter of D for the second type parameter of B.

class B<T, U> {}  
class D<V, W> : B<int, V> {}  
Class B(Of T, U)  
End Class  
Class D(Of V, W)  
    Inherits B(Of Integer, V)  
End Class  
generic<typename T, typename U> ref class B {};  
generic<typename V, typename W> ref class D : B<int, V> {};  

Wenn Sie ein Type -Objekt erhalten, das ein D<V, W> ist und die BaseType -Eigenschaft zum Abrufen des Basistyps verwenden, ist das resultierende type B<int, V> -Objekt ein offener Typ, der jedoch keine generische Typdefinition darstellt.If you obtain a Type object representing D<V, W> and use the BaseType property to obtain its base type, the resulting type B<int, V> is open, but it is not a generic type definition.

Quelle eines generischen ParametersSource of a Generic Parameter

Ein generischer Typparameter kann von einem überprüften Typ, einschließenden Typ oder von einer generischen Methode stammen.A generic type parameter might come from the type you are examining, from an enclosing type, or from a generic method. Die Quelle des generischen Typparameters kann folgendermaßen bestimmt werden:You can determine the source of the generic type parameter as follows:

  • Verwenden Sie zuerst die DeclaringMethod -Eigenschaft, um zu ermitteln, ob der Typparameter von einer generischen Methode stammt.First, use the DeclaringMethod property to determine whether the type parameter comes from a generic method. Wenn der Eigenschaftswert kein NULL-Verweis ist (Nothing in Visual Basic), ist die Quelle eine generische Methode.If the property value is not a null reference (Nothing in Visual Basic), then the source is a generic method.

  • Wenn die Quelle keine generische Methode ist, verwenden Sie die DeclaringType -Eigenschaft zum Bestimmen des generischen Typs, zu dem der generische Typparameter gehört.If the source is not a generic method, use the DeclaringType property to determine the generic type the generic type parameter belongs to.

Wenn der Typparameter zu einer generischen Methode gehört, gibt die DeclaringType -Eigenschaft den Typ zurück, der die generische irrelevante Methode deklariert hat.If the type parameter belongs to a generic method, the DeclaringType property returns the type that declared the generic method, which is irrelevant.

Position eines generischen ParametersPosition of a Generic Parameter

In seltenen Fällen ist es erforderlich, die Position eines Typparameters in der Typparameterliste seiner deklarierenden Klasse zu ermitteln.In rare situations, it is necessary to determine the position of a type parameter in the type parameter list of its declaring class. Angenommen Sie verfügen über ein Type -Objekt, das den B<int, V> -Typ aus dem vorherigen Beispiel darstellt.For example, suppose you have a Type object representing the B<int, V> type from the preceding example. Mit der GetGenericArguments -Methode erhalten Sie eine Liste von Typargumenten. Beim Überprüfen des V -Objekts können Sie dann die DeclaringMethod - und DeclaringType -Eigenschaften verwenden, um die Herkunft dieses Objekts zu bestimmen.The GetGenericArguments method gives you a list of type arguments, and when you examine V you can use the DeclaringMethod and DeclaringType properties to discover where it comes from. Sie können dann mithilfe der GenericParameterPosition -Eigenschaft seine Position in der Typparameterliste ermitteln, in dem es definiert wurde.You can then use the GenericParameterPosition property to determine its position in the type parameter list where it was defined. In diesem Beispiel befindet sich V an Position 0 (null) in der Typparameterliste, in der das Objekt definiert wurde.In this example, V is at position 0 (zero) in the type parameter list where it was defined.

Basistyp und SchnittstelleneinschränkungenBase Type and Interface Constraints

Verwenden Sie die GetGenericParameterConstraints -Methode, um die Basistypeinschränkung und Schnittstelleneinschränkungen eines Typparameters abzurufen.Use the GetGenericParameterConstraints method to obtain the base type constraint and interface constraints of a type parameter. Die Reihenfolge der Elemente des Arrays spielt keine Rolle.The order of the elements of the array is not significant. Ein Element stellt eine Schnittstelleneinschränkung dar, wenn es ein Schnittstellentyp ist.An element represents an interface constraint if it is an interface type.

Generische ParameterattributeGeneric Parameter Attributes

Die GenericParameterAttributes -Eigenschaft ruft einen GenericParameterAttributes -Wert ab, der die Varianz (Kovarianz oder Kontravarianz) und die besonderen Einschränkungen eines Typparameters angibt.The GenericParameterAttributes property gets a GenericParameterAttributes value that indicates the variance (covariance or contravariance) and the special constraints of a type parameter.

Kovarianz und KontravarianzCovariance and Contravariance

Zum Bestimmen, ob ein Typparameter kovariant oder kontravariant ist, können Sie die GenericParameterAttributes.VarianceMask -Maske auf den von der GenericParameterAttributes -Eigenschaft zurückgegebenen GenericParameterAttributes -Wert anwenden.To determine whether a type parameter is covariant or contravariant, apply the GenericParameterAttributes.VarianceMask mask to the GenericParameterAttributes value that is returned by the GenericParameterAttributes property. Wenn das Ergebnis GenericParameterAttributes.Noneist, ist der Typparameter invariant.If the result is GenericParameterAttributes.None, the type parameter is invariant. Siehe Kovarianz und Kontravarianz.See Covariance and Contravariance.

Besondere EinschränkungenSpecial Constraints

Wenden Sie zum Bestimmen von besonderen Einschränkungen eines Typparameters die GenericParameterAttributes.SpecialConstraintMask -Maske auf den von der GenericParameterAttributes -Eigenschaft zurückgegebenen GenericParameterAttributes -Wert an.To determine the special constraints of a type parameter, apply the GenericParameterAttributes.SpecialConstraintMask mask to the GenericParameterAttributes value that is returned by the GenericParameterAttributes property. Wenn das Ergebnis GenericParameterAttributes.Noneist, gibt es keine besonderen Einschränkungen.If the result is GenericParameterAttributes.None, there are no special constraints. Die Einschränkungen eines Typparameters können ein Verweistyp, ein Werttyp, der keine NULL-Werte zulässt, und ein parameterloser Konstruktor sein.A type parameter can be constrained to be a reference type, to be a non-nullable value type, and to have a parameterless constructor.

Zurück zum AnfangBack to top

InvariantenInvariants

Eine Tabelle der invarianten Bedingungen für allgemeine Begriffe in Reflektion für generische Typen finden Sie unter Type.IsGenericType.For a table of the invariant conditions for common terms in reflection for generic types, see Type.IsGenericType. Weitere Begriffe, die im Zusammenhang mit generischen Methoden stehen, finden Sie unter MethodBase.IsGenericMethod.For additional terms relating to generic methods, see MethodBase.IsGenericMethod.

Zurück zum AnfangBack to top

TitelTitle BeschreibungDescription
How to: Examine and Instantiate Generic Types with Reflection (Vorgehensweise: Erkennen und Bearbeiten von generischen Typen)How to: Examine and Instantiate Generic Types with Reflection Veranschaulicht die Verwendung von Eigenschaften und Methoden der Type- und MethodInfo-Objekte zum Untersuchen generischer Typen.Shows how to use the properties and methods of Type and MethodInfo to examine generic types.
GenericsGenerics Beschreibt das Genericsfeature und seine Unterstützung in .NET Framework.Describes the generics feature and how it is supported in the .NET Framework.
Gewusst wie: Definieren eines generischen Typs mit ReflektionsausgabeHow to: Define a Generic Type with Reflection Emit Veranschaulicht die Verwendung der Reflektionsausgabe zum Generieren generischer Typen in dynamischen Assemblys.Shows how to use reflection emit to generate generic types in dynamic assemblies.
Anzeigen von TypinformationenViewing Type Information Beschreibt die Type-Klasse und stellt Codebeispiele bereit, die zeigen, wie Type mit verschiedenen Reflektionsklassen verwendet wird, um Informationen zu Konstruktoren, Methoden, Feldern, Eigenschaften und Ereignissen abzurufen.Describes the Type class and provides code examples that illustrate how to use Type with various reflection classes to obtain information about constructors, methods, fields, properties, and events.