我正在为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;
}
}
}
}
}
所以我必须在找到匹配的类时检查命名空间,以确保它在我的项目中。这感觉就像我在做很多不必要的工作。这是他们用脚手架模板visual studio项目给出的例子:
ICodeTypeService codeTypeService = (ICodeTypeService)Context
.ServiceProvider.GetService(typeof(ICodeTypeService));
return codeTypeService
.GetAllCodeTypes(Context.ActiveProject)
.Where(codeType => codeType.IsValidWebProjectEntityType())
.Select(codeType => new ModelType(codeType));
是codetypeservice正确的方法吗?
修改 基本上,当它搜索类时,它不仅在当前活动项目中执行它,而且还搜索所有引用的项目。这就是为什么我必须检查名称空间,所以我只从活动项目中获得结果。我认为这就是为什么它被放慢速度,因为引用的项目非常大,所以它做了很多完全不必要的工作......
答案 0 :(得分:2)
我注意到有人提出这个问题,提醒我发布如何让它更快地工作。正如马斯洛所指出的那样,罗斯林很酷,但是当我构建这个扩展时罗斯林不可用,除了在预览中,所以基本上它只是毫无意义。
我的扩展程序位于GitHub上,这是相关的代码段:http://www.vogella.com/tutorials/AndroidSQLite/article.html
但是如果GitHub死了/有人为我的代码支付了一百万美元,这里是相关代码......
((AlarmList)mContext).deleteAlarm(((Long) view.getTag()).longValue());
获得所有项目项目后,您可以按其过滤。这似乎在相当大的项目中工作得很好,尽管我并没有真正拥有任何大型项目才能公平。在我的例子中,我想找到所有具有基类/// <summary>
/// Recursively gets all the ProjectItem objects in a list of projectitems from a Project
/// </summary>
/// <param name="projectItems">The project items.</param>
/// <returns></returns>
public IEnumerable<ProjectItem> GetProjectItems(EnvDTE.ProjectItems projectItems)
{
foreach (EnvDTE.ProjectItem item in projectItems)
{
yield return item;
if (item.SubProject != null)
{
foreach (EnvDTE.ProjectItem childItem in GetProjectItems(item.SubProject.ProjectItems))
yield return childItem;
}
else
{
foreach (EnvDTE.ProjectItem childItem in GetProjectItems(item.ProjectItems))
yield return childItem;
}
}
}
的类。所以我有这样的代码:
DatMigrationImpl