SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

状態遷移表からStateパターンを自動生成する

T4 templateで楽にコードを書こう


  • X ポスト
  • このエントリーをはてなブックマークに追加

<#+ メンバ定義 #>

 <#+ と #>で囲んだ部分はフィールドやメソッドの定義となり、<#~#>や<#=~#>の中から参照(利用)できます。

Hello.tt
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
using System;

class Hello {
  static public void say(string name) {
    Console.WriteLine("Hello, {0}",name);
<# foreach ( string fruit in basket ) { #>
    <#= fruit #>();
<# } #>
  }
<# foreach ( string fruit in basket ) { #>

  static private void <#= fruit #>() {
    Console.WriteLine("<#= i_like(fruit)#>");
  }
<# } #>
}
<#+
  string[] basket = { "apple", "banana", "cherry" };
  static string i_like(string item) {
    return string.Format("I like {0}", item.ToUpper());
  }
#>

 このテンプレートからは、以下のコードが生成されます。

Hello.cs
using System;

class Hello {
  static public void say(string name) {
    Console.WriteLine("Hello, {0}",name);
    apple();
    banana();
    cherry();
  }

  static private void apple() {
    Console.WriteLine("I like APPLE");
  }

  static private void banana() {
    Console.WriteLine("I like BANANA");
  }

  static private void cherry() {
    Console.WriteLine("I like CHERRY");
  }
}

 ここで1つご注意。<#+~#>によるメンバ定義は必ずテンプレートの末尾に置かなくてはなりません。ただし、<#+~#>を末尾に置いたテンプレートを<#@ include file="..." #>によって差し込むことは許されています。上記のテンプレートは以下のように書くことができます。

Body.tt.include
using System;

class Hello {
  static public void say(string name) {
    Console.WriteLine("Hello, {0}",name);
<# foreach ( string fruit in basket ) { #>
    <#= fruit #>();
<# } #>
  }
<# foreach ( string fruit in basket ) { #>

  static private void <#= fruit #>() {
    Console.WriteLine("<#= i_like(fruit)#>");
  }
<# } #>
}
<#+
  static string i_like(string item) {
    return string.Format("I like {0}", item.ToUpper());
  }
#>
Hello.tt
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ include file="Body.tt.include" #>
<#+
  string[] basket = { "apple", "banana", "cherry" };
#>

次のページ
状態遷移表からコード生成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5783 2011/05/27 19:12

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング