T4サンプル:
<#
// Here is the model
Model = new []
{
P ("string", "ClientName"),
P ("string", "DealerID"),
};
#>
<#
// Here is the "view", this can be extracted into a ttinclude file and reused
#>
namespace MyNameSpace
{
using System.Web;
partial class SessionState
{
<#
foreach (var propertyDefinition in Model)
{
#>
public static <#=propertyDefinition.Type#> <#=propertyDefinition.Name#>
{
get
{
object obj = HttpContext.Current.Session["<#=propertyDefinition.SessionName#>"];
if (obj != null)
{
return (<#=propertyDefinition.Type#>)obj;
}
return null;
}
set
{
HttpContext.Current.Session["<#=propertyDefinition.SessionName#>"] = value;
}
}
<#
}
#>
}
}
<#+
PropertyDefinition[] Model = new PropertyDefinition[0];
class PropertyDefinition
{
public string Type;
public string Name;
public string SessionName
{
get
{
var name = Name ?? "";
if (name.Length == 0)
{
return name;
}
return char.ToLower(name[0]) + name.Substring(1);
}
}
}
static PropertyDefinition P (string type, string name)
{
return new PropertyDefinition
{
Type = type ?? "<NoType>",
Name = name ?? "<NoName>",
};
}
#>
次のコードが生成されます。
namespace MyNameSpace
{
using System.Web;
partial class SessionState
{
public static string ClientName
{
get
{
object obj = HttpContext.Current.Session["clientName"];
if (obj != null)
{
return (string)obj;
}
return null;
}
set
{
HttpContext.Current.Session["clientName"] = value;
}
}
public static string DealerID
{
get
{
object obj = HttpContext.Current.Session["dealerID"];
if (obj != null)
{
return (string)obj;
}
return null;
}
set
{
HttpContext.Current.Session["dealerID"] = value;
}
}
}
}
「ビュー」を抽出すると、モデルファイルは次のようになります。
<#
// Here is the model
Model = new []
{
P ("string", "ClientName"),
P ("string", "DealerID"),
};
#>
<#@ include file="$(SolutionDir)\GenerateSessionState.ttinclude"#>
CodeSnippetsとT4について
CodeSnippets(およびResharperコードテンプレート)はT4と同等であると考えられることがあります。ではない。
CodeSnippets(およびその他)はコードの冗長性を促進し、基本的には追加のツールサポートを備えたCopyPasteプログラミングです。
T4(またはCodeSmith)は、維持するコードのコードの冗長性を減らすのに役立つメタプログラミングツールです(冗長なコードを生成する可能性がありますが、そのコードを維持する必要はありません)。
CodeSnippetsに関する思考実験。スニペットを広範囲に使用しましたが、生成されたコードに問題があることに気付きました。
どのように解決しますか?スニペットを使用してコードを調整したが、問題が発生したすべてのインスタンスを見つける必要があります。どのようにしてすべてのインスタンスを見つけますか?誰かがスニペットコードを変更したときに、どのように変更をマージしますか?
T4やCodeSmithなどのメタプログラミングツールを使用して、テンプレートを修正し、コードを再生成します。
これが、誰かがコードスニペットについて言及するたびに、私が内部で少し死ぬ理由です。