2016-08-10 21 views
1

エンティティデータモデルが更新または生成された後にいくつかのことを行うIModelGenerationExtensionを拡張するVSIX拡張を作成しています。ProjectItemの名前空間の取得

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

VSエクステンションを開発してからしばらくしていますが、私はそれらのものを検索する方法について私の古いコードのいくつかを見ました。たぶん、そこに新しい技術が今日あるが、これは私が知っているものです:

最初にあなたは* .csファイルのファイルを見つけるためにあなたがあなたのModel1.edmxのためになった項目の子ProjectItemsを反復することにより、正しいファイルを見つける必要があります

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

次に、あなたが最初に名前空間の構成を検索するために、このProjectItem csFileCodeModelを使用できます。

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

そしてそこにあなたの名前空間の要素を持っている必要があります。 CodeNamespaceは、プロパティNameFullNameを持っています。

私は古いコードで読んだものと一緒にこれをまとめましたが、今すぐテストできませんでした。あなたはエラー処理を追加する必要があります。私は、あなたがそれを記述したファイル階層がProjectItems階層のように実際に再現されていることを100%確信していません。

+0

ありがとうございました! – Adrian