T4 Template を触ってみた
XMLファイルを Linq to XML で読み込んで、T4 Template を使ってコードを生成してみたので、メモメモ。
まずは適当にコンソールアプリプロジェクトをつくって、入力用のXMLファイル(今回は People.xml)をプロジェクトに追加します。
<?xml version="1.0" encoding="utf-8" ?> <People> <Person name="Isabella" /> <Person name="Sophia" /> <Person name="Emma" /> <Person name="Olivia" /> <Person name="Ava" /> <Person name="Emily" /> <Person name="Abigail" /> <Person name="Madison" /> <Person name="Chloe" /> <Person name="Mia" /> </People>
続いて T4 Template ファイルをプロジェクトに追加します。T4 Template ファイルの追加は拡張子 tt の テキストファイル(今回は Template.tt)を追加すればOKです。
<#@ template language="C#" hostspecific="true" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core.dll" #> <#@ assembly name="System.Xml.dll" #> <#@ assembly name="System.Xml.Linq.dll" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Xml.Linq" #> using System; namespace T4TemplateSample { public class Program { public static void Main() { <# var xelm = XElement.Load(this.Host.ResolvePath("People.xml")); var query = from t in xelm.Elements("Person") select t; foreach (var t in query) { var name = t.Attribute("name").Value; #> Console.WriteLine("Hello <#= name #>"); <# } #> } } }
今回は Linq to XML を使うので、必要な System.Core.dll、System.Xml.dll、System.Xml.Linq.dll を assembly ディレクティブで読み込み、import ディレクティブで System.Linq、System.Xml.Linq 名前空間をインポートします。
T4 Template ファイルを保存すると、それと同名の CS ファイルにテンプレートの実行結果が出力されます(今回は Template.cs)。
using System; namespace T4TemplateSample { public class Program { public static void Main() { Console.WriteLine("Hello Isabella"); Console.WriteLine("Hello Sophia"); Console.WriteLine("Hello Emma"); Console.WriteLine("Hello Olivia"); Console.WriteLine("Hello Ava"); Console.WriteLine("Hello Emily"); Console.WriteLine("Hello Abigail"); Console.WriteLine("Hello Madison"); Console.WriteLine("Hello Chloe"); Console.WriteLine("Hello Mia"); } } }
以上、すごく普通の内容になりましたけど、仕事ではこれでモデルとかをバリバリ自動生成していきたいなー。