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" #> <# IEnumerableprojects = 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 IEnumerableFindAllProjects() { 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"に設定する必要がある。