2008-11-19 3 views

Antwort

6

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. ..

17

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.

+1

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

+0

+1 danke. Die Umwandlung zu T hinzugefügt, die den Code für mich kompiliert hat. –

+0

@SamHolder: Hey, du kannst bearbeiten, um alle Fehler zu beheben, die du gefunden hast ... – Will

4

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)
+0

Alle Instanzen eines Objekts. – Simon

1
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[] {}; 
} 
+0

schön - aber wie bekomme ich die Instanzen dieser Typen? – Simon

+0

@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

+0

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

2

Wenn die Klassen die angegebene Schnittstelle implementiert sind Ihnen dann können Sie eine Liste der schwache Verweise auf Instanziierung implementieren.

+0

Ich fürchte, sie gehören nicht alle uns. – Simon

Verwandte Themen