2016-08-10 1 views
1

J'écris une extension VSIX qui étend IModelGenerationExtension qui effectue certaines opérations après la mise à jour ou la génération d'un modèle de données d'entité.Obtention de l'espace de nom d'un objet ProjectItem

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

Depuis ce fonctionne sur un modèle de données d'entité, la context.ProjectItem sera un fichier .edmx - Appelons cette Model1.edmx. Celui-ci contiendra un fichier nommé Model1.tt qui à son tour contient des fichiers imbriqués .cs associés chacun à une entité. Ce que je dois faire est d'obtenir l'espace de noms d'un de ces fichiers .cs (toutes les entités seront sur le même espace de noms) à partir de ProjectItem.

enter image description here

Comment puis-je aller à ce sujet?

Répondre

1

Il y a quelque temps depuis que j'ai développé une extension VS, mais j'ai regardé une partie de mon ancien code sur la façon de rechercher ces choses. Peut-être il y a des nouvelles technologies aujourd'hui, mais ce que je sais:

Au début, vous devriez trouver le bon fichier par itérer l'enfant ProjectItems de l'élément que vous avez pour votre Model1.edmx pour trouver les fichiers du *:

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")); 

Ensuite, vous pouvez utiliser le FileCodeModel de cette ProjectItem cs pour rechercher la première configuration d'espace de noms:

CodeNamespace nsp = cs.FileCodeModel.CodeElements.Cast<CodeElement>(). 
      OfType<CodeNamespace>().First(); 

Et là, vous devez avoir votre élément d'espace de noms. CodeNamespace a une propriété Name et FullName. J'ai mis cela ensemble à partir de ce que j'ai lu dans mes anciens codes, mais je ne pouvais pas le tester tout de suite. Vous devez ajouter une gestion des erreurs et je ne suis pas sûr à 100% que la hiérarchie des fichiers telle que vous l'avez décrite est réellement reproduite comme cela dans la hiérarchie ProjectItems.

+0

Ça semble fonctionner, merci! – Adrian