MethodInfo.MakeGenericMethod-Methode (System.Reflection)

Ansicht wechseln:
Ohne Scripts
.NET Framework-Klassenbibliothek für Silverlight
MethodInfo.MakeGenericMethod-Methode

Ersetzt die Typparameter der aktuellen generischen Methodendefinition durch die Elemente eines Arrays von Typen und gibt ein MethodInfo-Objekt zurück, das die sich ergebende konstruierte Methode darstellt.

Namespace:  System.Reflection
Assembly:  mscorlib (in mscorlib.dll)
Syntax

Visual Basic (Deklaration)
Public Overridable Function MakeGenericMethod ( _
	ParamArray typeArguments As Type() _
) As MethodInfo
Visual Basic (Verwendung)
Dim instance As MethodInfo
Dim typeArguments As Type()
Dim returnValue As MethodInfo

returnValue = instance.MakeGenericMethod(typeArguments)
C#
public virtual MethodInfo MakeGenericMethod(
	params Type[] typeArguments
)

Parameter

typeArguments
Typ: System.Type()
Ein Array von Typen, die die Typparameter der aktuellen generischen Methodendefinition ersetzen sollen.

Rückgabewert

Typ: System.Reflection.MethodInfo
Ein MethodInfo-Objekt, das die konstruierte Methode darstellt, die durch Ersetzen der Typparameter der aktuellen generischen Methodendefinition durch die Elemente von typeArguments erstellt wurde.
Ausnahmen

Ausnahme Bedingung
InvalidOperationException

Die aktuelle MethodInfo stellt keine generische Methodendefinition dar. Das heißt, IsGenericMethodDefinition gibt false zurück.

ArgumentNullException

typeArguments ist Nothing.

- oder -

Eines der Elemente von typeArguments ist Nothing.

ArgumentException

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

- oder -

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

NotSupportedException

Diese Methode wird nicht unterstützt.

Hinweise

Mit der MakeGenericMethod-Methode können Sie Code verfassen, in dem den Typparametern einer generischen Methodendefinition spezifische Typen zugewiesen werden, um auf diese Weise ein MethodInfo-Objekt zu erstellen, das eine bestimmte konstruierte Methode darstellt. Wenn durch die ContainsGenericParameters-Eigenschaft dieses MethodInfo-Objekts true zurückgegeben wird, können Sie sie verwenden, um die Methode aufzurufen oder um einen Delegaten zu erstellen, der die Methode aufruft.

Methoden, die mit der MakeGenericMethod-Methode konstruiert werden, können offen sein. Das heißt, dass einige ihrer Typargumente Typparameter von einschließenden generischen Typen sein können. Sie können solche offen konstruierten Methoden z. B. verwenden, wenn Sie dynamische Assemblys generieren. Sehen Sie sich beispielsweise den folgenden C#- und Visual Basic-Code an.

class C
{
    T N<T,U>(T t, U u) {...}
    public V M<V>(V v)
    {
        return N<V,int>(v, 42);
    }
}

Class C
    Public Function N(Of T,U)(ByVal ta As T, ByVal ua As U) As T
        ...
    End Function
    Public Function M(Of V)(ByVal va As V ) As V
        Return N(Of V, Integer)(va, 42)
    End Function
End Class


Der Methodentext von M enthält einen Aufruf der Methode N, in dem der Typparameter von M und der Typ Int32 angegeben werden. Mit der IsGenericMethodDefinition-Eigenschaft wird für die N<V,int>-Methode der Wert false zurückgegeben. Mit der ContainsGenericParameters-Eigenschaft wird true zurückgegeben. Daher kann die Methode N<V,int> nicht aufgerufen werden.

Eine Liste der unveränderlichen Bedingungen für spezifische Begriffe zu generischen Methoden finden Sie unter der IsGenericMethod-Eigenschaft. Eine Liste der unveränderlichen Bedingungen für andere Begriffe, die in generischer Reflektion verwendet werden, finden Sie unter der IsGenericType-Eigenschaft.

Plattformspezifische Anmerkungen

Silverlight für Windows Phone:

 MakeGenericMethod ist vorhanden, wird aber unter Silverlight für Windows Phone nicht unterstützt.
Beispiele

Im folgenden Codebeispiel werden die Eigenschaften und Methoden von MethodInfo veranschaulicht, die die Überprüfung generischer Methoden unterstützen. Im Beispiel wird Folgendes ausgeführt:

  • Definiert eine Klasse, die über eine generische Methode verfügt.

  • Erstellt eine MethodInfo, die die generische Methode darstellt.

  • Zeigt Eigenschaften der generischen Methodendefinition an.

  • Weist den Typparametern von MethodInfo Typargumente zu und ruft die sich ergebende konstruierte generische Methode auf.

  • Zeigt Eigenschaften der konstruierten generischen Methode an.

  • Ruft die generische Methodendefinition aus der konstruierten Methode ab und vergleicht diese mit der ursprünglichen Definition.

Hinweis Hinweis:

Anweisungen zur Ausführung dieses Beispiels finden Sie unter Erstellen von Beispielen, bei denen eine Demomethode und ein TextBlock-Steuerelement zum Einsatz kommen.

Visual Basic

Imports System.Reflection

' Define a class with a generic method.
Public Class Test
   Public Shared Sub Generic(Of T)(ByVal outputBlock As System.Windows.Controls.TextBlock, ByVal toDisplay As T)
      outputBlock.Text &= String.Format(vbCrLf & "Here it is: {0}", toDisplay) & vbCrLf
   End Sub
End Class

Public Class Example
   Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)
      outputBlock.Text &= vbCrLf & "--- Examine a generic method." & vbCrLf

      ' Create a Type object representing class Test, and
      ' get a MethodInfo representing the generic method.
      '
      Dim ex As Type = GetType(Test)
      Dim mi As MethodInfo = ex.GetMethod("Generic")

      DisplayGenericMethodInfo(outputBlock, mi)

      ' Assign the Integer type to the type parameter of the Example 
      ' method.
      '
      Dim arguments() As Type = {GetType(Integer)}
      Dim miConstructed As MethodInfo = mi.MakeGenericMethod(arguments)

      DisplayGenericMethodInfo(outputBlock, miConstructed)

      ' Invoke the method.
      Dim args() As Object = {outputBlock, 42}
      miConstructed.Invoke(Nothing, args)

      ' Invoke the method normally.
      Test.Generic(Of Integer)(outputBlock, 42)

      ' Get the generic type definition from the constructed method,
      ' and show that it's the same as the original definition.
      '
      Dim miDef As MethodInfo = miConstructed.GetGenericMethodDefinition()
      outputBlock.Text &= String.Format(vbCrLf & "The definition is the same: {0}", _
          miDef Is mi) & vbCrLf
   End Sub 'Main

   Private Shared Sub DisplayGenericMethodInfo(ByVal outputBlock As System.Windows.Controls.TextBlock, ByVal mi As MethodInfo)
      outputBlock.Text &= vbCrLf & mi.ToString() & vbCrLf

      outputBlock.Text &= String.Format(vbTab _
          & "Is this a generic method definition? {0}", _
          mi.IsGenericMethodDefinition) & vbCrLf

      outputBlock.Text &= String.Format(vbTab & "Is it a generic method? {0}", _
          mi.IsGenericMethod) & vbCrLf

      outputBlock.Text &= String.Format(vbTab _
          & "Does it have unassigned generic parameters? {0}", _
          mi.ContainsGenericParameters) & vbCrLf

      ' If this is a generic method, display its type arguments.
      '
      If mi.IsGenericMethod Then
         Dim typeArguments As Type() = mi.GetGenericArguments()

         outputBlock.Text &= String.Format(vbTab & "List type arguments ({0}) & vbCrLf:", _
             typeArguments.Length)

         For Each tParam As Type In typeArguments
            ' IsGenericParameter is true only for generic type
            ' parameters.
            '
            If tParam.IsGenericParameter Then
               outputBlock.Text &= String.Format(vbTab & vbTab _
                   & "{0}  parameter position: {1}" _
                   & vbCrLf & vbTab & vbTab _
                   & "   declaring method: {2}", _
                   tParam, _
                   tParam.GenericParameterPosition, _
                   tParam.DeclaringMethod) & vbCrLf
            Else
               outputBlock.Text &= vbTab & vbTab & tParam.ToString() & vbCrLf
            End If
         Next tParam
      End If
   End Sub
End Class

' This example produces the following output:
'
'--- Examine a generic method.
'
'Void Generic[T](T)
'        Is this a generic method definition? True
'        Is it a generic method? True
'        Does it have unassigned generic parameters? True
'        List type arguments (1):
'                T  parameter position: 0
'                   declaring method: Void Generic[T](T)
'
'Void Generic[Int32](Int32)
'        Is this a generic method definition? False
'        Is it a generic method? True
'        Does it have unassigned generic parameters? False
'        List type arguments (1):
'                System.Int32
'
'Here it is: 42
'
'Here it is: 42
'
'The definition is the same: True
'


C#

using System;
using System.Reflection;

// Define a class with a generic method.
public class Test
{
   public static void Generic<T>(System.Windows.Controls.TextBlock outputBlock, T toDisplay)
   {
      outputBlock.Text += String.Format("\r\nHere it is: {0}", toDisplay) + "\n";
   }
}

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      outputBlock.Text += "\r\n--- Examine a generic method." + "\n";

      // Create a Type object representing class Test, and
      // get a MethodInfo representing the generic method.
      //
      Type ex = typeof(Test);
      MethodInfo mi = ex.GetMethod("Generic");

      DisplayGenericMethodInfo(outputBlock, mi);

      // Assign the int type to the type parameter of the Example 
      // method.
      //
      MethodInfo miConstructed = mi.MakeGenericMethod(typeof(int));

      DisplayGenericMethodInfo(outputBlock, miConstructed);

      // Invoke the method.
      object[] args = {outputBlock, 42};
      miConstructed.Invoke(null, args);

      // Invoke the method normally.
      Test.Generic<int>(outputBlock, 42);

      // Get the generic type definition from the closed method,
      // and show it's the same as the original definition.
      //
      MethodInfo miDef = miConstructed.GetGenericMethodDefinition();
      outputBlock.Text += String.Format("\r\nThe definition is the same: {0}",
          miDef == mi) + "\n";
   }

   private static void DisplayGenericMethodInfo(System.Windows.Controls.TextBlock outputBlock, MethodInfo mi)
   {
      outputBlock.Text += String.Format("\r\n{0}", mi) + "\n";

      outputBlock.Text += String.Format("\tIs this a generic method definition? {0}",
          mi.IsGenericMethodDefinition) + "\n";

      outputBlock.Text += String.Format("\tIs it a generic method? {0}",
          mi.IsGenericMethod) + "\n";

      outputBlock.Text += String.Format("\tDoes it have unassigned generic parameters? {0}",
          mi.ContainsGenericParameters) + "\n";

      // If this is a generic method, display its type arguments.
      //
      if (mi.IsGenericMethod)
      {
         Type[] typeArguments = mi.GetGenericArguments();

         outputBlock.Text += String.Format("\tList type arguments ({0}):",
             typeArguments.Length) + "\n";

         foreach (Type tParam in typeArguments)
         {
            // IsGenericParameter is true only for generic type
            // parameters.
            //
            if (tParam.IsGenericParameter)
            {
               outputBlock.Text += String.Format("\t\t{0}  parameter position {1}" +
                   "\n\t\t   declaring method: {2}",
                   tParam,
                   tParam.GenericParameterPosition,
                   tParam.DeclaringMethod) + "\n";
            }
            else
            {
               outputBlock.Text += String.Format("\t\t{0}", tParam) + "\n";
            }
         }
      }
   }
}

/* This example produces the following output:

--- Examine a generic method.

Void Generic[T](T)
        Is this a generic method definition? True
        Is it a generic method? True
        Does it have unassigned generic parameters? True
        List type arguments (1):
                T  parameter position 0
                   declaring method: Void Generic[T](T)

Void Generic[Int32](Int32)
        Is this a generic method definition? False
        Is it a generic method? True
        Does it have unassigned generic parameters? False
        List type arguments (1):
                System.Int32

Here it is: 42

Here it is: 42

The definition is the same: True

 */


Plattformen

Eine Liste der von Silverlight unterstützten Betriebssysteme und Browser finden Sie in Unterstützte Betriebssysteme und Browser unter "Unterstützte Betriebssysteme und Browser".

Versionsinformationen

Silverlight

Unterstützt in: 4, 3

Silverlight für Windows Phone

Unterstützt in: Windows Phone OS 7.0
Siehe auch

Referenz

Weitere Ressourcen