Trouver des implémentations d’interfaces en C#

Si vous travaillez avec C#, un défi commun auquel les développeurs sont confrontés est d’identifier les implémentations d’interfaces au moment de l’exécution. Cela peut être particulièrement utile lorsque vous souhaitez sélectionner une implémentation spécifique en fonction de son nom. Dans cet article de blog, nous allons explorer comment y parvenir pour une interface nommée IStep en utilisant la réflexion.

Compréhension du problème

L’interface IStep représente une étape qui peut effectuer des calculs. Au moment de l’exécution, vous pouvez avoir besoin de choisir une implémentation de IStep en fonction d’un nom de classe que vous fournissez. L’objectif est de trouver dynamiquement la classe appropriée qui implémente cette interface dans l’assemblage actuel.

Scénario d’exemple

Imaginez que vous avez diverses classes qui implémentent IStep comme suit :

public class StepOne : IStep { /* Implémentation */ }
public class StepTwo : IStep { /* Implémentation */ }
// Autres implémentations...

Vous souhaitez récupérer une instance de l’une de ces classes en fournissant son nom de classe, par exemple, comment obtenir une instance de StepOne ?

Solution étape par étape

1. Trouver toutes les implémentations de IStep

Pour trouver tous les types dans l’assemblage actuel qui implémentent l’interface IStep, vous pouvez utiliser le code suivant :

foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
{
    if (!typeof(IStep).IsAssignableFrom(t)) continue;
    Console.WriteLine(t.FullName + " implémente " + typeof(IStep).FullName);
}

Explication :

  • Assembly.GetCallingAssembly() : Cela permet d’obtenir l’assemblage qui contient le code qui s’exécute actuellement.
  • GetTypes() : Cette méthode récupère tous les types définis dans l’assemblage.
  • IsAssignableFrom(t) : Cela vérifie si IStep peut être assigné à partir du type t, ce qui signifie que t implémente IStep.

2. Instancier une implémentation spécifique

Si vous connaissez déjà le nom exact de l’implémentation dont vous avez besoin, vous pouvez créer une instance comme ceci :

IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType"));

Décomposition :

  • Type.GetType(“MyNamespace.MyType”) : Cela récupère l’objet Type associé au nom de classe entièrement qualifié.
  • Activator.CreateInstance : Cette méthode crée dynamiquement une instance du type spécifié.

3. Mettre le tout ensemble

Vous pouvez maintenant utiliser ces extraits de code dans votre application pour sélectionner et instancier dynamiquement les implémentations de votre interface. Par exemple :

string sName = "MyNamespace.StepOne"; // Exemple de nom de classe
IStep step = (IStep)Activator.CreateInstance(Type.GetType(sName));

// Vous pouvez maintenant utiliser 'step' selon vos besoins

Conclusion

En employant la réflexion et les capacités intégrées du framework .NET, vous pouvez trouver et instancier efficacement des implémentations d’interfaces au moment de l’exécution. Cette approche peut grandement améliorer la flexibilité de vos applications C#.

Restez aventurier en programmant, et rappelez-vous qu’avec les bons outils, vous pouvez relever n’importe quel défi de programmation de front !