MethodInfo.MakeGenericMethod(Type[]) Método

Definición

Sustituye los elementos de una matriz de tipos por los parámetros de tipo de la definición de método genérico actual y devuelve un objeto MethodInfo que representa el método construido resultante.

public virtual System.Reflection.MethodInfo MakeGenericMethod (params Type[] typeArguments);

Parámetros

typeArguments
Type[]

Matriz de tipos que se van a sustituir por los parámetros de tipo de la definición de método genérico actual.

Devoluciones

Objeto MethodInfo que representa el método construido formado al sustituir los elementos de typeArguments por los parámetros de tipo de la definición de método genérico actual.

Excepciones

El MethodInfo actual no representa una definición de método genérico. Es decir, IsGenericMethodDefinition devuelve false.

typeArguments es null.

O bien

Cualquier elemento de typeArguments es null.

El número de elementos de typeArguments no coincide con el número de parámetros de tipo de la definición de método genérico actual.

O bien

Algún elemento de typeArguments no satisface las restricciones especificadas para el parámetro de tipo correspondiente de la definición de método genérico actual.

No se admite este método.

Ejemplos

En el ejemplo de código siguiente se muestran las propiedades y los métodos de MethodInfo que admiten el examen de métodos genéricos. El ejemplo hace lo siguiente:

  • Define una clase que tiene un método genérico.

  • Crea un MethodInfo objeto que representa el método genérico.

  • Muestra las propiedades de la definición de método genérico.

  • Asigna argumentos de tipo a los parámetros de tipo de MethodInfoe invoca el método genérico construido resultante.

  • Muestra las propiedades del método genérico construido.

  • Recupera la definición de método genérico del método construido y la compara con la definición original.

using System;
using System.Reflection;

// Define a class with a generic method.
public class Example
{
    public static void Generic<T>(T toDisplay)
    {
        Console.WriteLine("\r\nHere it is: {0}", toDisplay);
    }
}

public class Test
{
    public static void Main()
    {
        Console.WriteLine("\r\n--- Examine a generic method.");

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

        DisplayGenericMethodInfo(mi);

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

        DisplayGenericMethodInfo(miConstructed);

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

        // Invoke the method normally.
        Example.Generic<int>(42);

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

    private static void DisplayGenericMethodInfo(MethodInfo mi)
    {
        Console.WriteLine("\r\n{0}", mi);

        Console.WriteLine("\tIs this a generic method definition? {0}",
            mi.IsGenericMethodDefinition);

        Console.WriteLine("\tIs it a generic method? {0}",
            mi.IsGenericMethod);

        Console.WriteLine("\tDoes it have unassigned generic parameters? {0}",
            mi.ContainsGenericParameters);

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

            Console.WriteLine("\tList type arguments ({0}):",
                typeArguments.Length);

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

/* 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

 */

Comentarios

El MakeGenericMethod método permite escribir código que asigna tipos específicos a los parámetros de tipo de una definición de método genérico, creando así un MethodInfo objeto que representa un método construido en particular. Si la ContainsGenericParameters propiedad de este MethodInfo objeto devuelve true, puede usarla para invocar el método o para crear un delegado para invocar el método.

Los métodos construidos con el MakeGenericMethod método pueden estar abiertos, es decir, algunos de sus argumentos de tipo pueden ser parámetros de tipo de tipos de tipos genéricos envolventes. Puede usar estos métodos construidos abiertos al generar ensamblados dinámicos. Por ejemplo, considere el siguiente código de C#, Visual Basic y C++.

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

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

El cuerpo del método de M contiene una llamada al método N, especificando el parámetro type de M y el tipo Int32. La IsGenericMethodDefinition propiedad devuelve false para el método N<V,int>. La ContainsGenericParameters propiedad devuelve true, por lo que no se puede invocar el método N<V,int> .

Para obtener una lista de las condiciones invariables para los términos específicos de los métodos genéricos, vea la IsGenericMethod propiedad . Para obtener una lista de las condiciones invariables para otros términos usados en la reflexión genérica, vea la IsGenericType propiedad .

Se aplica a

Producto Versiones
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Consulte también