Comment appeler une méthode générique avec un object Type donné?

Je veux appeler ma méthode générique avec un object de type donné.

void Foo(Type t) { MyGenericMethod(); } 

ne fonctionne évidemment pas.

Comment puis-je le faire fonctionner?

Votre exemple de code ne fonctionnera pas, car la méthode générique attend un identificateur de type et non une instance de la classe Type. Vous devrez utiliser la reflection pour le faire:

 public class Example { public void CallingTest() { MethodInfo method = typeof (Example).GetMethod("Test"); MethodInfo genericMethod = method.MakeGenericMethod(typeof (ssortingng)); genericMethod.Invoke(this, null); } public void Test() { Console.WriteLine(typeof (T).Name); } } 

Gardez à l’esprit que c’est très fragile, je vous suggère plutôt de trouver un autre modèle pour appeler votre méthode.

Une autre solution de piratage (peut-être que quelqu’un peut rendre un peu plus propre) serait d’utiliser une forme d’expression magique:

 public class Example { public void CallingTest() { MethodInfo method = GetMethod(x => x.Test()); MethodInfo genericMethod = method.MakeGenericMethod(typeof (ssortingng)); genericMethod.Invoke(this, null); } public static MethodInfo GetMethod(Expression> expr) { return ((MethodCallExpression) expr.Body) .Method .GetGenericMethodDefinition(); } public void Test() { Console.WriteLine(typeof (T).Name); } } 

Notez en passant l’identificateur de type ‘object’ en tant qu’argument de type générique dans le lambda. Impossible de comprendre si rapidement comment contourner cela. Quoi qu’il en soit, je pense que c’est la compilation en toute sécurité. Il se sent juste mal en quelque sorte: /

Vous devez utiliser la reflection, malheureusement (pour les raisons mentionnées par Jared). Par exemple:

 MethodInfo method = typeof(Foo).GetMethod("MyGenericMethod"); method = method.MakeGenericMethod(t); method.Invoke(this, new object[0]); 

De toute évidence, vous voudriez plus de vérification des erreurs dans la réalité 🙂


Note secondaire: mon MSDN local ne spécifie pas que le paramètre de MakeGenericMethod est un tableau de parameters, donc je m’attendais à exiger:

 method = method.MakeGenericMethod(new Type[] { t }); 

mais il semble que ce soit un tableau de parameters dans la réalité, et les documents en ligne MSDN sont d’accord. Impair.

Cette approche ne fonctionnera pas. La raison en est que Type est un object dont le type est déterminé lors de l’exécution. Cependant, vous essayez de l’utiliser pour appeler une méthode générique. Un type d’appel de méthode générique est établi au moment de la compilation. Par conséquent, un object Type ne peut jamais être utilisé pour un paramètre de type sur une méthode générique.