"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo invocar dinámicamente métodos genéricos con argumentos de tipo de tiempo de ejecución en C#?

¿Cómo puedo invocar dinámicamente métodos genéricos con argumentos de tipo de tiempo de ejecución en C#?

Publicado el 2025-03-22
Navegar:450

How Can I Dynamically Invoke Generic Methods with Runtime-Determined Type Arguments in C#?

llamando a métodos genéricos con argumentos de tipo dinámico

problema

en su escenario, desea iterar a través de una colección de interfaces en un espacio de nombres específico e invocar dinámicamente un método genérico para cada interfaz. Sin embargo, encuentra errores de tiempo de compilación debido a los argumentos de tipo desconocido en el tiempo de compilación.

solución

para llamar dinámicamente métodos genéricos con el tiempo de ejecución de los argumentos de tipo de tiempo de ejecución, puede usar la reflexión de la siguiente manera:

  1. obtenga la información del método genérico : use el tipo. definición.
  2. Genere la instancia de método genérico : llame al método MakeGenericMethod en la definición del método genérico para generar la instancia de método específico para el argumento de tipo deseado.
  3. Invoke la instancia del método genérico : Use el método invoquero para invocar la instancia generica genérica con la instancia genérica requerida con la instancia requerida requerida con la instancia requerida requerida Argumentos.
Código de ejemplo

usando el sistema; usando System.Linq; usando System.Reflección; clase de prueba de clase pública { Public estático void callGeneric () { Console.WriteLine ($ "tipo genérico: {typeof (t)}"); } Public static void main () { var ensamblaje = ensamblaje.getExecutingAssembly (); Var interfaces = ensamblaje.gettypes () .Where (t => t.namespace == "mynamespace.Interfaces"); var genicmethod = typeof (testClass) .getMethod ("callGeneric"); foreach (var interfacetype en interfaces) { var genicMethodInstance = genicMethod.makegenericMethod (interfaceType); genicmethodinstance.invoke (nulo, nulo); // no se necesitan objetivo ni argumentos } } }
using System;
using System.Linq;
using System.Reflection;

public class TestClass
{
    public static void CallGeneric()
    {
        Console.WriteLine($"Generic type: {typeof(T)}");
    }

    public static void Main()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var interfaces = assembly.GetTypes()
            .Where(t => t.Namespace == "MyNamespace.Interfaces");

        var genericMethod = typeof(TestClass).GetMethod("CallGeneric");

        foreach (var interfaceType in interfaces)
        {
            var genericMethodInstance = genericMethod.MakeGenericMethod(interfaceType);
            genericMethodInstance.Invoke(null, null); // No target or arguments needed
        }
    }
}
en este ejemplo:

    El método de callegenérico se define como un método genérico que imprime el argumento de tipo genérico.
  • obtenemos todos los tipos de un espacio de nombres específico que el método de mynamespace Instancia de método para cada tipo de interfaz.
  • Invocamos la instancia de método genérico sin ningún objetivo o argumentos, ya que es un método estático sin ningún parámetro.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3