获取ProjectItem的命名空间

时间:2016-08-10 14:47:16

标签: c# vsix envdte

我正在编写扩展IModelGenerationExtension的VSIX扩展,它在更新或生成实体数据模型后执行某些操作。

public class ModelGenerationExtension : IModelGenerationExtension
{
    public void OnAfterModelGenerated(ModelGenerationExtensionContext context)
    {
    }
    public void OnAfterModelUpdated(UpdateModelExtensionContext context)
    {
        //need namespace of context.ProjectItem here
    }
}

由于这是在实体数据模型上运行,context.ProjectItem将是.edmx文件 - 让我们调用此Model1.edmx。这将包含一个名为Model1.tt的文件,该文件又包含一些嵌套的 .cs 文件,每个文件都与一个实体相关联。

我需要做的是从ProjectItem获取其中一个.cs文件的命名空间(所有实体将在同一命名空间中)。

enter image description here

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不久之前我开发了一个VS扩展,但是我查看了一些关于如何搜索这些内容的旧代码。也许今天有更新的技术,但这就是我所知道的:

首先,您应该通过遍历ProjectItems项目的子项Model1.edmx找到正确的文件来找到* .cs文件:

ProjectItem tt = context.ProjectItem.ProjectItems.OfType<ProjectItem>()
                        .FirstOrDefault(item => item.Name == "Model1.tt");

ProjectItem cs = tt.ProjectItems.OfType<ProjectItem>()
                        .FirstOrDefault(item => item.Name.EndsWith(".cs"));

然后您可以使用此FileCodeModel的{​​{1}}来搜索第一个命名空间配置:

ProjectItem cs

你应该有你的名字命名元素。 CodeNamespace nsp = cs.FileCodeModel.CodeElements.Cast<CodeElement>(). OfType<CodeNamespace>().First(); 有一个属性CodeNamespace和一个Name

我把它放在我在旧代码中读到的内容中,但现在无法测试它。您需要添加错误处理,并且我不能100%确定您所描述的文件层次结构是否真的像FullName层次结构中那样被复制。