Wie mit einer Schnittstelle arbeiten dynamisch aus einer Baugruppe geladen und rufen ihre Mitglieder

StackOverflow https://stackoverflow.com/questions/280578

Frage

Ich habe einige Code bekam eine Baugruppe zu laden und alle Arten zu erhalten, die eine bestimmte Schnittstelle implementieren, wie dies (unter der Annahme asm ist eine gültige und geladene Assembly).

var results = from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select type;

Jetzt bin ich fest: Ich brauche Instanzen dieser Objekte zu erstellen und zu Methoden und Eigenschaften für das Objekt aufrufen. Und ich brauche für eine spätere Verwendung der Verweise auf die erstellten Objekte in einem Array zu speichern.

War es hilfreich?

Lösung

Oh wow - ich nur gebloggt diese ein vor ein paar Tagen. Hier ist meine Methode Instanzen aller Typen zurückzugeben, die eine bestimmte Schnittstelle implementieren:

private static IEnumerable<T> InstancesOf<T>() where T : class
{
    var type = typeof(T);
    return from t in type.Assembly.GetExportedTypes()
           where t.IsClass
               && type.IsAssignableFrom(t)
               && t.GetConstructor(new Type[0]) != null
           select (T)Activator.CreateInstance(t);
}

Wenn Sie dieses Refactoring eher einen Montageparameter zu akzeptieren, als die Schnittstelle der Baugruppe verwendet wird, wird es flexibel genug, um Ihren Bedarf anpassen.

Andere Tipps

Sie können eine Instanz einen Typ mit der Activator.CreateInstance Methode erstellen: -

IServiceJob x = Activator.CreateInstance(type);

So Ihr Code wird: -

IServiceJob[] results = (from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select (IServiceJob)Activator.CreateInstance(type)).ToArray();

(Hinweis Änderung var IServiceJob [] deutlich zu machen, was geschaffen wird).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top