¿Cómo obtengo todas las instancias de todos los tipos cargados que implementan una interfaz determinada?

Necesitamos obtener todas las instancias de los objetos que implementan una interfaz determinada. ¿Podemos hacerlo y, de ser así, cómo?

No creo que haya una manera … Tendría que ser capaz de recorrer el Heap, examinar cada objeto allí, o recorrer la stack de cada hilo activo en el espacio de proceso de la aplicación, examinando cada variable de referencia de la stack en cada hilo …

Por otro lado, (supongo que no se puede hacer) es interceptar todas las actividades de creación de Objetos (usando un enfoque de contenedor) y mantener una lista de todos los objetos en su aplicación …

Si necesita instancias (ejemplos) de todos los tipos que implementan una interfaz en particular, puede examinar todos los tipos, verificar la interfaz y crear una instancia si se encuentra una coincidencia.

Aquí hay un pseudocódigo que se parece notablemente a C # e incluso puede comstackr y devolver lo que necesita. Si nada más, te indicará en la dirección correcta:

public static IEnumerable GetInstancesOfImplementingTypes() { 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; } } } } 

Ahora, si está hablando de recorrer el montón y volver instancias previamente instanciadas de todos los objetos que implementan un tipo particular, buena suerte, ya que esta información no está almacenada por el tiempo de ejecución .Net (puede ser calculada por debuggers / profilers al examinar montones / stack así).

Dependiendo de la razón por la que piensas que debes hacer eso, probablemente haya mejores formas de hacerlo.

Todas las instancias de un objeto, o todos los tipos?

Obtener todas las instancias de un objeto sería casi imposible, e involucraría información no pública sobre el escaneo a través de la memoria de gestión.

Obtener todos los tipos que implementan una interfaz determinada es factible, dentro de un dominio dado. (es decir, puede encontrar todo tipo definido dentro de un ensamblaje que implemente una interfaz particular)

  • Cargar la Asamblea
  • Iterar a través de sus tipos (llamar a asm.GetTypes ())
  • Comprobar typeof (IMyInterface) .IsAssignibleFrom (testType)

Si las clases que implementan la interfaz especificada son suyas, entonces puede implementar una lista de referencias débiles en la creación de instancias.

 IEnumerable GetAllTypesThatImplementInterface() { 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[] {}; }