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 typet
, ce qui signifie quet
implémenteIStep
.
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 !