T4 Text TemplateによるViewModelクラスの生成 その2

前回のエントリで書いた通り、T4 Text TemplateによるViewModelの生成のためのジェネレータを作成していく。

なお、テンプレート自身はViewModelGenerate.ttという名前とし、共通で使うであろう関数群はUtil.ttという別な名前のテンプレートに定義して、ViewModelGenerate.ttでincludeすることとする。

Visual Studio ソリューション情報から全てのプロジェクト情報を列挙

EnvDTE名前空間のEnvDTE.DTEインタフェースを使うことで現在のソリューション配下の全てのプロジェクトを列挙する。

  • ViewModelGenerate.tt
<#@ template language="C#" debug="true" hostspecific="true" #>
<#@ output extension="cs"#>
<#@ import namespace="System"#>
<#@ include file="Util.tt" #>
<#
    IEnumerable projects = FindAllProjects();

処理の見通しが良くなるように、共通で使う関数は別なテンプレートに格納しておく。

  • Util.tt
<#@ template language="C#" debug="true" hostspecific="true" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="EnvDTE" #>
<#@ import Namespace="EnvDTE" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#+ 
    public IEnumerable FindAllProjects()
    {
        EnvDTE.DTE dte = GetDTE();
        foreach (EnvDTE.Project p in dte.Solution.Projects)
        {
            yield return p;
        }
    }
    public EnvDTE.DTE GetDTE()
    {
        IServiceProvider hostServiceProvider = (IServiceProvider)Host;
        return (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
    }             

長くなるので取りあえずここまで。
IEnumerableにはソリューション中のプロジェクトが列挙されるので、このプロジェクト中の構成要素を調べていくことになる。

なお、Util.ttのGetDTEメソッドで使用しているHostというシンボルはこのテンプレートがクラスに変換される際にMicrosoft.VisualStudio.TextTemplating.ITextTemplatingEngineHostインタフェースとして参照することができるプロパティだが、それにはtemplateディレクティブのhostspecific属性を"true"に設定する必要がある。