Maison >développement back-end >C++ >Comment appeler une méthode générique avec un argument de type déterminé par l'exécution ?

Comment appeler une méthode générique avec un argument de type déterminé par l'exécution ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-30 15:36:09746parcourir

How to Call a Generic Method with a Runtime-Determined Type Argument?

Appel d'une méthode générique avec un argument de type connu uniquement au moment de l'exécution

Problème : appel dynamique d'une méthode générique

Vous souhaitez appeler une méthode générique avec un argument de type qui n’est connu qu’au moment de l’exécution. Par exemple, vous avez une liste d'interfaces et vous souhaitez appeler une méthode générique pour chaque interface.

Solution : Invocation dynamique basée sur la réflexion

Étant donné que l'argument de type n'est pas connu à la compilation temps, vous ne pouvez pas utiliser l’invocation de méthode traditionnelle avec des génériques. Au lieu de cela, vous devez utiliser la réflexion pour appeler dynamiquement la méthode générique en fonction de l'argument de type obtenu lors de l'exécution.

Voici comment implémenter cette approche :

  1. Obtenez le Méthode générique : Utilisez Type.GetMethod pour récupérer la méthode générique.
  2. Construisez le type générique Argument : Utilisez Type.GetTypeArguments pour identifier le paramètre de type générique. Ensuite, créez un objet Type représentant l'argument de type réel que vous souhaitez utiliser.
  3. Créer une instance de méthode générique : Utilisez MakeGenericMethod sur la méthode générique pour en créer une instance spécifique avec le type donné. argument.
  4. Invoquer la méthode générique : Enfin, utilisez Invoke sur l'instance de méthode générique créée pour l'invoquer dynamiquement.

Exemple dans le code

// Original Method
public void Method<T>() {
    // Method body
}

// Main Method
var assembly = Assembly.GetExecutingAssembly();
var interfaces = assembly.GetTypes().Where(t => t.Namespace == "MyNamespace.Interfaces");

foreach (var interfaceType in interfaces) {
    MethodInfo genericMethod = typeof(Test).GetMethod("Method");
    MethodInfo specificMethod = genericMethod.MakeGenericMethod(interfaceType);
    specificMethod.Invoke(null, null); // No arguments for this example
}

En utilisant la réflexion, cette approche vous permet d'appeler dynamiquement la méthode générique avec des arguments de type inconnu au moment de l'exécution.

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