Accueil > .Net, C# > [C#] Reflexion et méthode générique

[C#] Reflexion et méthode générique

Récemment, j’ai eu un besoin assez con : appeler une méthode générique sur un type que je ne connais qu’au runtime.
Et là, c’est un peu le drame.

En effet, il n’est pas possible de faire un truc du genre DoSomething().
J’aurais bien sûr pu changer l’architecture et la relation entre les différentes classes, sortir un design pattern…mais le fait est que ça aurait été sortir l’artillerie lourde pour pas grand chose.
D’autant plus qu’avec l’architecture en place, j’aurais pu tomber sur des références circulaires…

Du coup, je me suis fait deux petites méthodes :

private static MethodInfo GetMethod<T>(String name)
{
     return typeof(T).GetMethod(name);
}

Cette méthode prend en type générique « T » la classe dans laquelle se trouve la méthode et en paramètre « name » le nom de la méthode.
Et là, attention, la casse est importante.

Du coup, j’ai récupéré le MethodInfo contenant ma méthode.
Mais dans le cas où elle est générique, il faut appeler une autre méthode :

private static MethodInfo GetGenericMethod(MethodInfo method, params Type[] types)
{
      return method.MakeGenericMethod(types);
}

Là, on obtient la méthode générique à proprement parlé et on peut faire son Invoke() dessus.
Au final, on pourrait également raccourcir comme il suit :

private static MethodInfo GetGenericMethod<T>(String name, params Type[] types)
{
     MethodInfo method = GetMethod<T>(name);
     return method.MakeGenericMethod(types);
}

L’utilisation serait donc : GetGenericMethod(« GetAll », myObj.GetType());
Simple, rapide, efficace.
Ceci dit, la réflexion, c’est un peu comme l’alcool : à utiliser avec modération !😉

Catégories :.Net, C#
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :