检索源代码模型元素

Retrieving source code model elements

我正在开发我的第一个 VS 扩展。目标是在解决方案资源管理器中单击包含 class 或接口的文件,然后使用 t4 模板从中生成相关的 class,例如代码合同,或元数据 class,或 DTO 等。我成功地创建了我的扩展菜单(似乎比以前版本的 VS 更容易 - 太好了!)在 VS 的实验实例中,我创建了最简单的带有一个非常简单的 class 和一个 int 属性 的命令行项目。我想做的第一件事是当我右键单击该文件时,如果它不包含 class 或界面,我想隐藏我的扩展菜单项。我的 MenuItemBeforeQueryStatus 处理程序代码目前看起来相当简单:

SourceProjectItem = ((IEnumerable)Dte2.ToolWindows
                                      .SolutionExplorer
                                      .SelectedItems)
                          .OfType<UIHierarchyItem>()
                          .FirstOrDefault()
                          .Object as ProjectItem;
SourcePathName    = SourceProjectItem.Document.FullName;
SourceCodeModel   = SourceProjectItem.FileCodeModel as FileCodeModel2;

foreach (CodeElement2 element in SourceCodeModel.CodeElements)
{
    SourceCodeClass = element as CodeClass2;

    if (SourceCodeClass != null)
        break;

    SourceInterfaceClass = element as CodeInterface2;

    if (SourceInterfaceClass != null)
        break;
}

前三行似乎工作正常:我得到了正确的文件路径,我得到了源代码模型的非空 COM 包装器,但在循环结束后 SourceCodeClass 为空。我在这里缺少什么,请帮忙。

啊,当然!发布问题一分钟后我意识到:我必须递归地寻找 class 或界面。我上面的循环只在命名空间上循环。