A solução by @ulrichc parece perfeita e funciona bem para projetos de pequeno a médio porte nos quais você não está usando nenhuma estrutura de Injeção de Dependência , como Castle ou Ninject, mas e se você estiver usando o contêiner DI [Castle por exemplo] e tiver algo como o seguinte:
public class IoC
{
private WindsorContainer _container;
private IoC()
{
_container = new WindsorContainer();
}
public static void RegisterFromAssembly(Assembly assembly, string classEndsWith, LifeTime lifeTime)
{
var lifestyle = ConvertLifeStyleType(lifeTime);
_container.Register(AllTypes.FromAssembly(assembly)
.Where(type => type.Name.EndsWith(classEndsWith))
.WithService.AllInterfaces()
.Configure(c => c.LifeStyle.Is(lifestyle))
.WithService.FirstInterface());
}
}
Como você pode ver, RegisterFromAssembly passa por todos os tipos dentro da montagem e, às cegas [com base no parâmetro de métodos], os adiciona ao contêiner no tempo de execução.
Você precisará de algo como o plug-in Agent Mulder, que fornece navegação para os tipos registrados ou resolvidos dentro de seus contêineres. Isso novamente pode visualmente [tempo de design possível] funcionar, mas você não tem certeza, a menos que toda vez que remover a classe não utilizada, execute todos os testes dentro do aplicativo [todas as camadas possíveis] para ter 80% de certeza de que está seguro. Moral da história: uma classe pode parecer não utilizada para o Resharper, mas pode ser ressuscitada quando você usa a Injeção de Dependência.