Я создаю инструмент для создания лесов для Visual Studio, и мне нужно представить список классов, которые являются производными от определенного абстрактного класса, но только классов в активном проекте. У меня он работает, но визуальной студии требуется немного времени, чтобы запустить код.
ICodeTypeService codeTypeService = (ICodeTypeService)Context
.ServiceProvider.GetService(typeof(ICodeTypeService));
var types = codeTypeService.GetAllCodeTypes(Context.ActiveProject);
foreach (var type in types)
{
type.
if (type.Kind == vsCMElement.vsCMElementClass)
{
foreach (var d in type.Bases)
{
var dClass = d as CodeClass;
var name = type.Name;
if (dClass.Name == "MyAbstractClass")
{
if (type.Namespace.Name.Contains(Context.ActiveProject.Name))
{
yield return type.Name;
}
}
}
}
}
Поэтому мне нужно проверить пространство имен, когда он найдет соответствующий класс, чтобы убедиться, что он находится в моем проекте. Такое ощущение, что я делаю кучу ненужной работы. Это пример, который они приводят с проектом визуальной студии шаблона каркаса:
ICodeTypeService codeTypeService = (ICodeTypeService)Context
.ServiceProvider.GetService(typeof(ICodeTypeService));
return codeTypeService
.GetAllCodeTypes(Context.ActiveProject)
.Where(codeType => codeType.IsValidWebProjectEntityType())
.Select(codeType => new ModelType(codeType));
правильный ли способ сделать это с помощью codetypeservice?
РЕДАКТИРОВАТЬ Обычно, когда он ищет классы, он не просто выполняет это в текущем активном проекте, но также ищет все проекты, на которые есть ссылки. Вот почему мне нужно проверить пространство имен, чтобы получить результаты только из активного проекта. Я считаю, что именно поэтому он замедляется, потому что проекты, на которые есть ссылки, довольно большие, поэтому он выполняет чертовски много совершенно ненужной работы ...
Roslyn
для анализа и написания C #. плюс частиRoslyn
уже есть в VS2013 - person Maslow   schedule 01.10.2014