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 等元编程工具,您可以修复模板并重新生成代码。
这就是为什么每次有人提到代码片段时我都会在内心深处死去。