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
Libérer: 2024-12-30 14:53:16
original
1006 Les gens l'ont consulté

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!
    }
}
Copier après la connexion

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");
    Copier après la connexion
  2. Créez le méthode générique avec MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
    Copier après la connexion
  3. Invoquez la méthode avec Invoke:

    genericMethod.Invoke(null, null); // No target or arguments in this case
    Copier après la connexion

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);
            }
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal