C#で簡易テンプレート処理
2007-09-17


いきなりC#ネタ

ZF入門も書かずに脈絡なく。しかも.NET 1.1。ごめん、がんばる。

ありそうで見つからないので

ここしばらく久しぶりに仕事でC#を使っている。まぁだいぶ勘も戻ってきて、「やっぱ慣れてる言語はよいなー」とか思っていたのだが、ちょっと欲しい機能が見つからなかった。

いま実装中の機能で、DataSetにキャッシュしたデータをもとにUPDATE用のクエリを生成するのだが、状況によってすこしだけ異なるクエリを生成し分ける必要にせまられ、簡単なテンプレートエンジンが欲しくなったのだ。

ひょっとするとすでに優秀なライブラリがあるかもしれない(実はあとでNVelocityなんてのがあることに気づいた)が、探して評価している時間もないので割り切った機能で自作をしてみた。

仕事で作ったやつなのでネタにするのはちょっと抵抗あるが、仕様検討も含めて1時間かかるかかからないかくらいの規模だし、どうせ誰かが似たようなやつ作ってるだろうしでソースを公開してみることにした。需要あるかはわからんけど。

仕様

ってほど機能があるわけではないが、標準のString.Formatのインデックスベースのプレースホルダの代わりにIDictionaryのキーやDataColumnのカラム名を使うように考えた。要はこちらで紹介されている「JSON - String.prototype.supplant」みたいな記法だ。

たとえば

string template = "name={Name}, value={Value}";
みたいなテンプレートがあって、これに を与えるって使い方。 その他はなんの付加価値もない。条件分岐も繰り返し処理もサブテンプレートの差込もできない。

ただし、パラメータ名の表記は後ろにコロン+フォーマット指定ができるように展開するため、String.Formatと同様にフォーマット指定できるようにしてみた。

仕組み

ソースみればだいたいわかると思うが、以下のようなプロセスで展開する。

  1. {}で囲まれたパラメータ名を抽出順にリストにし、そのインデックス番号でもってテンプレート内のパラメータ名を置換する
  2. 展開時はパラメータ名のリストを順次走査して与えられたDataRowやIDictionaryから値を抽出してobject[]を作成、先に変換したテンプレートを用いてString.Formatする
こんな感じでかなりシンプル。

ソース

このくらいの感じ。例によってNYSLってことで。



続きを読む

[.NET]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット