Maison >développement back-end >C++ >Comment puis-je appeler des méthodes génériques avec des types déterminés par l'exécution ?

Comment puis-je appeler des méthodes génériques avec des types déterminés par l'exécution ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-30 14:53:161019parcourir

How Can I Call Generic Methods with Runtime-Determined Types?

Appel de méthodes génériques avec des types déterminés au moment de l'exécution

Ce problème survient lors de la tentative d'appel d'une méthode générique avec un paramètre de type inconnu au moment de la compilation . Les appels de méthode ordinaires reposent sur des contrôles de sécurité de type effectués par le compilateur, mais lorsque le type n'est disponible qu'au moment de l'exécution, des approches alternatives sont nécessaires.

Solution basée sur la réflexion

Dans le contexte de l'exemple de code fourni :

public void Method<T>() where T : class {}
public void AnotherMethod()
{
    ...
    foreach (var interface in interfaces)
    {
        Method<interface>(); // Compile error!
    }
}

Pour contourner le type à la compilation vérification :

  1. Récupérez la méthode générique ouverte à l'aide de Type.GetMethod:

    MethodInfo method = typeof(Test).GetMethod("Method");
  2. Créez le méthode générique avec MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
  3. Invoquez la méthode avec Invoke:

    genericMethod.Invoke(null, null); // No target or arguments in this case

Exemple complet

Pour clarifier le processus, considérez cet exemple de code révisé :

using System;
using System.Linq;
using System.Reflection;

namespace Sample
{
    interface IFoo { }
    interface IBar { }

    class Program
    {
        public static void CallMe<T>()
        {
            Console.WriteLine("Type of T: {0}", typeof(T));
        }

        static void Main()
        {
            var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample");

            var methodInfo = typeof(Program).GetMethod("CallMe");

            foreach (var type in types)
            {
                var genericMethodInfo = methodInfo.MakeGenericMethod(type);
                genericMethodInfo.Invoke(null, null);
            }
        }
    }
}

Dans cet exemple, la méthode générique CallMe est appelée dynamiquement en fonction des types trouvés dans l'espace de noms Sample.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn