获取Visual Studio Scaffolder中项目的所有类

时间:2014-08-26 11:34:27

标签: c# visual-studio envdte

我正在为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正确的方法吗?

修改 基本上,当它搜索类时,它不仅在当前活动项目中执行它,而且还搜索所有引用的项目。这就是为什么我必须检查名称空间,所以我只从活动项目中获得结果。我认为这就是为什么它被放慢速度,因为引用的项目非常大,所以它做了很多完全不必要的工作......

1 个答案:

答案 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