У меня есть шаблон T4, который генерирует мои классы свободного строителя для моих api-контрактов.Поэтому, когда у меня есть контракт CreatePersonRequest, который имеет имя и имя, я генерирую CreatePersonRequestBuilder, который создает CreatePersonRequest.
Таким образом, мои сборщики всегда в курсе, и, унаследовав одно из них, я легко могу сделать различныепредварительно заполненные объекты с хорошим синтаксисом.
Это прекрасно работает, когда все мои проекты находятся в корне моего решения.Как только я начал добавлять папки с решениями, это больше не работало.
public EnvDTE.Project GetProjectByName(string projectName) {
var serviceProvider = (IServiceProvider)this.Host;
var dte = (EnvDTE.DTE)serviceProvider.GetService(typeof(EnvDTE.DTE));
var solution = dte.Solution;
foreach (Project p in solution.Projects)
{
if (p != null) {
if (p.Name == projectName){
return p;
}
}
}
return null;
}
Вначале я извлекаю все свои проекты из своих решений, а затем перебираю их и проверяю имя.Очевидно, слово «проект» здесь также может означать папку решения.
Довольно легко исправить, подумал я.Проверьте тип проекта (это может быть проект / папка / ....) и, если папка, перейдите глубже в иерархию ProjectItems.
Проблема, с которой я столкнулся, состоит в том, что у меня есть ProjectItem, которыйинтерфейс (и не реализованный в Project).Поэтому у меня нет возможности преобразовать этот ProjectItem в проект (хотя свойство ProjectItem.Kind говорит мне, что это проект).
Как можно глубже извлечь проекты в иерархию решений?