Решение от @ulrichc звучит идеально и отлично работает для небольших и средних проектов, в которых вы не используете Dependency Injection фреймворк, такой как Castle или Ninject, но что, если вы используете DI контейнер [Замок например], и у вас есть что-то вроде следующего:
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());
}
}
Как вы видите, RegisterFromAssembly просматривает все типы внутри сборки и вслепую [на основе параметра методов] добавляет их в контейнер во время выполнения.
Вам понадобится что-то вроде Agent Mulder плагин, который обеспечивает навигацию для типов, зарегистрированных или разрешенных внутри ваших контейнеров. Это опять-таки может визуально [время разработки возможно] сработать, но вы не будете в этом уверены, если каждый раз, когда вы удаляете неиспользуемый класс, вы запускаете все тесты внутри своего приложения [каждого возможного уровня], чтобы быть на 80% уверенными в своей безопасности. Мораль истории: класс может показаться неиспользованным для Ресарпера, но он может воскреснуть, когда вы используете Dependency Injection.