我正在编写扩展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文件的命名空间(所有实体将在同一命名空间中)。
我该如何解决这个问题?
答案 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
层次结构中那样被复制。