Wir müssen alle Instanzen von Objekten erhalten, die eine bestimmte Schnittstelle implementieren - können wir das tun, und wenn ja, wie?Wie bekomme ich alle Instanzen aller geladenen Typen, die eine bestimmte Schnittstelle implementieren?
Antwort
Ich glaube nicht, dass es einen Weg gibt ... Du müsstest entweder in der Lage sein, den Haufen zu gehen und jedes Objekt dort zu untersuchen, oder den Stapel jedes aktiven Threads im Anwendungsprozessraum gehen und jeden untersuchen Stapelreferenzvariable auf jedem Thread ...
Der andere Weg (ich nehme an, Sie können nicht) ist, alle Aktivitäten der Objekterzeugung abzufangen (mit einem Container-Ansatz) und eine Liste aller Objekte in Ihrer Anwendung zu behalten. ..
Wenn Sie Instanzen (Samples) aller Typen benötigen, die eine bestimmte Schnittstelle implementieren, können Sie alle Typen durchsuchen, nach der Schnittstelle suchen und die Instanz erstellen, falls die Übereinstimmung gefunden wurde.
Hier ist ein Pseudocode, der wie C# aussieht und sogar kompilieren und zurückgeben kann, was Sie brauchen. Wenn nichts anderes, wird es Ihnen in die richtige Richtung weisen:
public static IEnumerable<T> GetInstancesOfImplementingTypes<T>()
{
AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
Type targetType = typeof(T);
foreach (Assembly a in ass)
{
types = a.GetTypes();
foreach (Type t in types)
{
if (t.IsInterface) continue;
if (t.IsAbstract) continue;
foreach (Type iface in t.GetInterfaces())
{
if (!iface.Equals(targetType)) continue;
yield return (T) Activator.CreateInstance(t);
break;
}
}
}
}
Nun, wenn Sie sprechen über den Haufen zu Fuß und zuvor instanziiert Instanzen aller Objekte zurückkehrt, die einen bestimmten Typ, viel Glück auf, daß das Gerät als Diese Information wird nicht von der .Net-Laufzeitumgebung gespeichert (kann von debugers/profilers durch Untersuchung von Heap/Stack berechnet werden).
Abhängig von dem Grund, warum Sie denken, dass Sie tun müssen, gibt es wahrscheinlich bessere Möglichkeiten, um darüber zu gehen.
Alle Instanzen eines Objekts oder alle Typen?
Das Erhalten aller Instanzen eines Objekts wäre ziemlich unmöglich und würde nicht-öffentliche Informationen über den Scan über den Managementspeicher beinhalten.
Das Abrufen aller Typen, die eine bestimmte Schnittstelle implementieren, ist innerhalb einer bestimmten Domäne möglich. (Dh Sie können alle Arten innerhalb einer Baugruppe definiert finden, die eine bestimmte Schnittstelle implementieren)
- laden die Versammlung
- Iterate durch sie die Typen (Call asm.GetTypes())
- prüfen typeof (IMyInterface) .IsAssignibleFrom (testtype)
Alle Instanzen eines Objekts. – Simon
IEnumerable<Type> GetAllTypesThatImplementInterface<T>()
{
var @interface = typeof (T);
return @interface.IsInterface
? AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Where(type => !type.IsInterface
&& !type.IsAbstract
&& type.GetInterfaces().Contains(@interface))
: new Type[] {};
}
schön - aber wie bekomme ich die Instanzen dieser Typen? – Simon
@Simon, Die einzige Möglichkeit besteht darin, bei der Erstellung Verweise auf jede Instanz zu registrieren. Sie können nicht auf sie zugreifen, ohne vorher einen solchen Mechanismus einzurichten. Abhängig von Ihrem Anwendungsfall sollten Sie sich vielleicht [ObservableCollection] (http://msdn.microsoft.com/en-us/library/ms668604.aspx) ansehen ... Was ist Ihr Anwendungsfall? – smartcaveman
ist es nach meinem Kommentar in @ Wills Antwort - wir laden Module, die ihre Einstellungen mit Objekten speichern, die die gleiche Schnittstelle implementieren, aber es scheint keine andere Möglichkeit zu geben, die Einstellungsinstanzen herauszubekommen. – Simon
Wenn die Klassen die angegebene Schnittstelle implementiert sind Ihnen dann können Sie eine Liste der schwache Verweise auf Instanziierung implementieren.
Ich fürchte, sie gehören nicht alle uns. – Simon
- 1. Abrufen aller Typen, die eine Schnittstelle implementieren
- 2. Wie bekomme ich eine Liste aller geladenen Typen in C#?
- 3. Abrufen aller Typen, die eine Schnittstelle in .NET Core implementieren
- 4. So finden Sie alle Instanzen von Typen, die eine bestimmte Schnittstelle beim Debuggen implementieren
- 5. Wie Auflisten aller CoClasses, die eine bestimmte COM-Schnittstelle implementieren?
- 6. Auflisten aller Delphi-Klassen, die eine bestimmte Schnittstelle implementieren?
- 7. Wie finden Sie alle Klassen, die eine bestimmte Schnittstelle implementieren?
- 8. Alle Klassen, die eine bestimmte Schnittstelle in WinRT implementieren
- 9. Wie bekomme ich eine Liste aller aktuell geladenen Baugruppen?
- 10. 2sxc: Wie bekomme ich eine Liste aller Anwendungen? Inhalt-Typen
- 11. JAXB generierte Klassen bestimmter Typen, die eine benutzerdefinierte Schnittstelle implementieren
- 12. Inject alle Dienste, die eine Schnittstelle implementieren
- 13. PHP: Wie bekomme ich eine Liste von Klassen, die bestimmte Schnittstellen implementieren?
- 14. Chromium: Wie bekomme ich alle Form einer geladenen Seite
- 15. Erhalte alle C# -Typen, die zuerst eine Schnittstelle implementieren, aber keine abgeleiteten Klassen
- 16. Wie listet ich alle Elemente auf, die eine generische Schnittstelle implementieren?
- 17. Wie kann ich die Iterable-Schnittstelle implementieren?
- 18. Rufen Sie alle Klassen, die eine Schnittstelle implementieren
- 19. Wie bekomme ich eine Liste von geladenen Laufzeitpaketen?
- 20. Klasse Design: Klasse implementieren eine Schnittstelle implementieren eine andere Schnittstelle
- 21. Muss ich alle Benutzersteuerungseigenschaften per Schnittstelle in WPF implementieren?
- 22. Holen Sie sich alle registrierten Implementierungen einer Schnittstelle in Autofac
- 23. Wie listet man alle Klassen auf, die eine Schnittstelle mit ReSharper implementieren?
- 24. Wie passe ich Typen an, die keine bestimmte Typklasseninstanz haben?
- 25. ReflectionTypeLoadException: Typ versucht eine nicht zugreifbare Schnittstelle zu implementieren
- 26. Wie man alle Klassen auf dem Klassenpfad auflistet, die eine bestimmte Menge von Schnittstellen implementieren
- 27. Erstellen eines benutzerdefinierten Ninject-Provider für mehrere Typen, die die gleiche Schnittstelle implementieren
- 28. Hier finden Sie eine Liste aller registrierten Objekte eine bestimmte Schnittstelle implementiert
- 29. Refactoring verrückte Vererbungshierarchien von Wertobjekten - Wie bekomme ich eine Liste aller Felder und Typen?
- 30. Implementieren alle Arrays in Java dieselbe Schnittstelle?
Ja, ich möchte zuvor instanziierte Instanzen erhalten. Das liegt daran, dass wir Module laden, die ihre Einstellungen mit Objekten speichern, die die gleiche Schnittstelle implementieren, aber es scheint keine andere Möglichkeit zu geben, die Einstellungsinstanzen zu entfernen. – Simon
+1 danke. Die Umwandlung zu T hinzugefügt, die den Code für mich kompiliert hat. –
@SamHolder: Hey, du kannst bearbeiten, um alle Fehler zu beheben, die du gefunden hast ... – Will