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

以上、すごく普通の内容になりましたけど、仕事ではこれでモデルとかをバリバリ自動生成していきたいなー。