c# - net - ¿Cómo encontrar todas las clases implementando IDisposable?
protected override void dispose (5)
Creo que algo como el código de abajo podría funcionar. Tendría que ajustarse para cargar el ensamblaje correcto si se ejecuta desde una herramienta externa.
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}
Estoy trabajando en un proyecto grande, y una de mis tareas es eliminar posibles fugas de memoria. En mi código, he notado que varios elementos IDisponibles no se han eliminado y lo he solucionado. Sin embargo, eso me lleva a una pregunta más básica, ¿cómo puedo encontrar todas las clases utilizadas en mi proyecto que implementan IDisposable? (No se crearon clases creadas a la medida, sino clases de biblioteca estándar que se han utilizado).
Ya he encontrado una clase menos que obvia que implementa IDisposable (DataTable implementa MarshalByValueComponent, que hereda IDisposable). En este momento, estoy revisando manualmente cualquier clase sospechosa utilizando MSDN, pero ¿no hay alguna manera de automatizar este proceso?
Prueba tu proyecto con FxCop. Puede atrapar todos los lugares donde los objetos IDisponibles no están dispuestos. Es posible que deba realizar algún trabajo para deshabilitar todas las reglas irrelevantes de FxCop, dejando solo las reglas relacionadas con IDisposable.
Por ejemplo, esta es una de las reglas IDisposibles de FxCop: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
Nota: debe encontrar sus propios objetos identificables, .NET y de terceros que no se manejan correctamente.
Puede usar NDepend para analizar su proyecto y encontrar todos los tipos que implementan IDisposable.
Aquí está la consulta cql para el resultado.
SELECT TYPES WHERE Implement "System.IDisposable"
intente esta consulta LINQ:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;
Reflector puede mostrarle qué clases implementan IDisposable
: solo ubique la interfaz IDisposable
en Reflector y expanda el nodo "Tipos derivados"
Otra opción, desde el código, es escanear todos los ensamblados cargados para los tipos que implementan IDisposable
:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;