[動作確認環境:VisualStudio2010 Express Edition,C#4.0]
VisualStudioでは、T4テンプレートというテンプレートエンジンを使ってコードを自動生成することができる。
ExpressEditionでも試すことができるので、簡単なコード生成を行ってみることにしよう。
今回は、テキストファイルに書かれた項目名からC#のEnumを生成してみる。
まず、VisualStuidoに新しいコンソールアプリケーションのソリューションを作り、「MyEnumNames.txt」という名前の
テキストファイルを追加する。
このファイルの中身は以下のようになっている。
Apple Banana Carrot Orange Melon Lemon Tomato
つぎに、「MyEnum.tt」というファイルを新規作成する。これがテンプレートファイルである。
T4テンプレートではファイルの拡張子を.ttとする。
テンプレートファイルの中身は、以下のように記述する。
<#@ template hostspecific="true" language="C#" #> <#@ assembly Name="System.Core.dll" #> <#@ import namespace="System" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { enum MyEnum { <# foreach (var line in System.IO.File.ReadLines( this.Host.ResolvePath("MyEnumNames.txt") ) ) { #> <#= line #>, <# } #> } }
このテンプレートファイルの中で<# #>で囲まれた部分はテンプレートエンジンの制御部である。
それ以外の部分はそのまま出力される。
テンプレートエンジンの制御ロジックはC#またはVBで書くことができる。
1~5行目に記述された<#@ #>で囲まれた部分はディレクティブという。
ここで使っているのはT4テンプレートディレクティブ、T4アセンブリディレクティブ、T4インポートディレクティブの3つである。
- T4テンプレートディレクティブ
- T4アセンブリディレクティブ
- T4インポートディレクティブ
<#@ template hostspecific=”true” language=”C#” #>のように記述する。
この例ではテンプレートの制御ロジック記述にC#の文法を使うことを指定している。
hostspecific=”true”としておくと、制御ロジック内のクラスにthis.Hostというプロパティが追加される。
Host.ResolvePath(filename)というメソッドを使うとプロジェクト内ファイルの絶対パスを取得できる。
今回はEnumの元となるテキストファイル「MyEnumNames.txt」を読み込みたいため、この記述を追記している。
<#@ assembly Name=”System.Core.dll” #>のように記述する。
テンプレートの制御ロジックで使用するアセンブリファイルを指定する。
VisulalStudioの参照設定にアセンブリ参照を追加するのと同様の働きをする。
今回はロジック内でLINQを使いたかったためSystem.Core.dllを追加したが、
System.dllだけならば自動的に読み込まれる。必要に応じてSystem.Xml.dllなどを取り込むと良い。
<#@ import namespace=”System” #>のように記述する。
この記述はC#の「using System;」などに相当する。
次に、17~24行目の<# #>で囲まれた部分を見てみよう。
この箇所はT4テンプレートの標準コントロールブロックである。
C#のコードがそのまま記述されており、ここではファイル「”MyEnumText.txt”」を読み込んで
読み込んだ行を順に繰り返している。
21行目の<#= line #>の部分は式コントロールブロックといい、この中に書かれた式を評価して文字列として出力する。
ここでは、lineという変数にファイルで読んだ1行分の文字列が入っているため、その内容が出力される。
このようにしてテンプレートファイルができたらソリューションエクスプローラーでttファイルを右クリックし、
「カスタム ツールの実行」を行う。するとその下にテンプレートの実行結果が出力される。
生成結果は以下のようになる。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { enum MyEnum { Apple, Banana, Carrot, Orange, Melon, Lemon, Tomato, } }
参考サイト:http://msdn.microsoft.com/ja-jp/library/bb126445.aspx