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 :
Récupérez la méthode générique ouverte à l'aide de Type.GetMethod:
MethodInfo method = typeof(Test).GetMethod("Method");
Créez le méthode générique avec MakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
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!