Implementierungen von Interfaces in C# finden

Wenn Sie mit C# arbeiten, ist eine häufige Herausforderung, vor der Entwickler stehen, die Identifizierung von Implementierungen von Interfaces zur Laufzeit. Dies kann besonders nützlich sein, wenn Sie eine spezifische Implementierung anhand ihres Namens auswählen möchten. In diesem Blogbeitrag werden wir untersuchen, wie Sie dies für ein Interface namens IStep unter Verwendung von Reflection erreichen können.

Das Problem verstehen

Das IStep-Interface repräsentiert einen Schritt, der Berechnungen durchführen kann. Zur Laufzeit müssen Sie möglicherweise eine Implementierung von IStep anhand eines von Ihnen bereitgestellten Klassennamens auswählen. Das Ziel ist es, die geeignete Klasse, die dieses Interface implementiert, dynamisch aus der aktuellen Assembly zu finden.

Beispiel-Szenario

Stellen Sie sich vor, Sie haben verschiedene Klassen, die IStep wie folgt implementieren:

public class StepOne : IStep { /* Implementierung */ }
public class StepTwo : IStep { /* Implementierung */ }
// Weitere Implementierungen...

Sie möchten eine Instanz einer dieser Klassen abrufen, indem Sie ihren Klassennamen angeben. Zum Beispiel: Wie erhalten Sie eine Instanz von StepOne?

Schritt-für-Schritt-Lösung

1. Alle Implementierungen von IStep finden

Um alle Typen in der aktuellen Assembly zu finden, die das IStep-Interface implementieren, können Sie den folgenden Code-Schnipsel verwenden:

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

Erklärung:

  • Assembly.GetCallingAssembly(): Dies gibt die Assembly zurück, die den Code enthält, der derzeit ausgeführt wird.
  • GetTypes(): Diese Methode ruft alle in der Assembly definierten Typen ab.
  • IsAssignableFrom(t): Dies überprüft, ob IStep von Typ t zugewiesen werden kann, was bedeutet, dass t IStep implementiert.

2. Eine spezifische Implementierung instanziieren

Wenn Sie bereits den genauen Namen der Implementierung kennen, die Sie benötigen, können Sie eine Instanz davon wie folgt erstellen:

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

Aufschlüsselung:

  • Type.GetType(“MyNamespace.MyType”): Dies ruft das Type-Objekt ab, das mit Ihrem vollständig qualifizierten Klassennamen verbunden ist.
  • Activator.CreateInstance: Diese Methode erstellt dynamisch eine Instanz des angegebenen Typs.

3. Alles zusammenfügen

Jetzt können Sie diese Schnipsel in Ihrer Anwendung verwenden, um dynamisch Implementierungen Ihres Interfaces auszuwählen und zu instanziieren. Zum Beispiel:

string sName = "MyNamespace.StepOne"; // Beispiel-Klassenname
IStep step = (IStep)Activator.CreateInstance(Type.GetType(sName));

// Jetzt können Sie 'step' nach Bedarf verwenden

Fazit

Durch den Einsatz von Reflection und den integrierten Funktionen des .NET-Frameworks können Sie effizient Implementierungen von Interfaces zur Laufzeit finden und instanziieren. Dieser Ansatz kann die Flexibilität Ihrer C#-Anwendungen erheblich verbessern.

Bleiben Sie abenteuerlustig beim Programmieren und denken Sie daran, dass Sie mit den richtigen Werkzeugen jede Programmierherausforderung erfolgreich bewältigen können!