检索源代码模型元素
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 或界面。我上面的循环只在命名空间上循环。
我正在开发我的第一个 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 或界面。我上面的循环只在命名空间上循环。