Necesitamos obtener todas las instancias de los objetos que implementan una interfaz determinada. ¿Podemos hacerlo y, de ser así, cómo?¿Cómo obtengo todas las instancias de todos los tipos cargados que implementan una interfaz determinada?
Respuesta
No creo que haya una manera ... Tendría que ser capaz de recorrer el Heap, examinar cada objeto allí, o recorrer la pila de cada hilo activo en el espacio de proceso de la aplicación, examinando cada variable de referencia de pila en cada subproceso ...
La otra forma (supongo que no se puede) es interceptar todas las actividades de creación de objetos (utilizando 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 particular, puede examinar todos los tipos, buscar 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 compilar y devolver lo que necesita. Si nada más, que te orientará en la dirección correcta:
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;
}
}
}
}
Ahora, si estamos hablando acerca de caminar la pila y volviendo casos anteriormente ejemplificados de todos los objetos que implementan un tipo particular, la buena suerte de que a medida esta información no es almacenada por .Net runtime (puede ser calculada por debugers/profilers al examinar heap/stack).
Dependiendo de la razón por la que cree que debe 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 administración.
Obtener todos los tipos que implementan una interfaz dada es factible --- dentro de un dominio dado. (Es decir, se puede encontrar todo tipo definido dentro de un conjunto que implementan una interfaz en particular)
- Cargar la Asamblea
- Iterar a través de él de tipos (llamar asm.GetTypes())
- Comprobar typeof (IMyInterface) .IsAssignibleFrom (testType)
Todas las instancias de un objeto. – 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[] {};
}
nice - pero ¿cómo obtengo las instancias de esos tipos? – Simon
@Simon, la única manera de hacerlo es registrar referencias a cada instancia en la creación. No puede acceder a ellos sin establecer dicho mecanismo por adelantado. Dependiendo de su caso de uso, es posible que desee consultar [ObservableCollection] (http://msdn.microsoft.com/en-us/library/ms668604.aspx) ... ¿Cuál es su caso de uso? – smartcaveman
es según mi comentario en la respuesta de @Will: cargamos módulos que almacenan su configuración utilizando objetos que implementan la misma interfaz, pero no parece haber otra forma de sacar las instancias de configuración. – Simon
Si las clases que implementan la interfaz especificada son los suyos a continuación, puede aplicar una lista de referencias débiles durante la instanciación.
Me temo que no son todas nuestras. – Simon
- 1. ¿Cómo encontrar todas las clases que implementan una interfaz determinada?
- 2. Obtención de todos los tipos que implementan una interfaz
- 3. ¿Enumerar todas las clases de Delphi que implementan una interfaz determinada?
- 4. ¿Cómo obtengo una lista de todos los tipos cargados en C#?
- 5. ¿Cómo obtengo una lista de todos los ensamblajes cargados actualmente?
- 6. ¿Cómo puede requerir un constructor sin parámetros para los tipos que implementan una interfaz?
- 7. ¿Cómo puedo hacer un seguimiento de (enumerar) todas las clases que implementan una interfaz?
- 8. ¿Cómo obtengo una lista de todos los caracteres Unicode que tienen una propiedad determinada?
- 9. NUnit - Cómo probar todas las clases que implementan una interfaz particular
- 10. Mantenga un registro de todas las clases que implementan una interfaz en particular?
- 11. Conseguir todas las instancias de una clase
- 12. Prueba de todas las clases que implementan una interfaz en Java
- 13. Obtener solo las propiedades que implementan una interfaz
- 14. Cómo inyectar dependencias en clases que implementan una interfaz?
- 15. ¿Cómo puedo encontrar qué clases implementan una interfaz determinada en Visual Studio?
- 16. Eclipse: encuentre todas las clases que extienden la interfaz
- 17. ¿Cómo encontrar todas las clases que implementan IDisposable?
- 18. ¿Cómo detener todas las instancias de cassini?
- 19. Inyección de dependencia de primavera: inyecte todas las instancias de la interfaz
- 20. ¿Se aplica la covarianza/contravarianza a tipos implícitamente convertibles que no implementan una interfaz común?
- 21. ¿Cómo hago una lista de todos los conjuntos cargados?
- 22. ¿Cómo edito todas las instancias resaltadas de una palabra simultáneamente?
- 23. JAXB: las clases generadas implementan la interfaz
- 24. ¿Cómo encontrar todos los subconjuntos posibles de una matriz determinada?
- 25. Buscar todas las subcadenas (en inglés) de una cadena determinada
- 26. Eliminar todas las instancias de CKEditor
- 27. require.js: Acceda a todos los módulos cargados
- 28. Imprimir todos los beans de resorte que están cargados
- 29. ¿Cómo puedo evitar escribir pruebas de unidades duplicadas para las clases que implementan la misma interfaz?
- 30. Cómo ejecutar todas las pruebas que pertenecen a una determinada categoría en JUnit 4
Sí, quiero obtener instancias previamente instanciadas. Es porque cargamos módulos que almacenan su configuración utilizando objetos que implementan la misma interfaz, pero no parece haber otra manera de sacar las instancias de configuración. – Simon
+1 gracias. Agregué el elenco a T, lo que hizo que el código compilara para mí. –
@SamHolder: Oye, puedes editar para corregir cualquier error que encuentres ... – Will