CodeSmith教程(8) CodeTemplate对象2013-01-19在使用代码模板产生代码时,CodeSmith引擎背后使用了不少对象来帮助代码的生成,其中常用的有CodeTempate (类似于Asp.Net的Page类) Progress 用于显示代码生成的进度 CodeTemplateInfo 可以返回关于当前模板自身 的一些信息。本篇介绍CodeTemplate ,CodeTemplate代表了由CodeSmith引擎处理的代码模板对象,可以通过CodeTemplate对象直接和 CodeSmith引擎交互,比如:使用 GetFileName 修改模板生成的缺省文件名 使用 Render method 把模板的输出到多个文件中 通过  events 把代码插入到CodeSmith引擎处理模板的过程中。 通过 Response 属性直接在输出文件中写内容 。使用GetFileName修改模板输出的文件名在前面的例子CodeSmith 使用教程(2): 编写第一个代码模板 我们已经使用GetFileName修改过输出的文件名,比如在 你的模板中定义了一个ClassName属性,可以通过GetFileName 把模板输出的缺省文件名改成类名
<%@ Template Language="C#" TargetLanguage="Text" %><%@ Property Name="ClassName" Type="System.String" Default="ClassName" %> This template shows off how to override the GetFileName method. <script runat="template">public override string GetFileName(){return ClassName + ".cs";}</script>重载ParseDefaultValue 方法在定义属性的缺省值时,有时有些属性的缺省值可能无法从String转换,此时 可以通过重载ParseDefaultValue 方法,这个方法会被CodeSmith引擎中处理每个属性时调用,如果你重载了这个方法,可 以按照你自己的逻辑来处理属性的缺省值。重载Render 方法CodeTemplate的Render方法是CodeSmith引擎生成 最终输出时调用的,可以通过重载这个方法来修改输出的内容或是把输出写到多个文件中。比如下面代码除了生成缺省的输 出外,还把输出写到另外两个文件中:
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="AddTextWriter Demonstration." %><%@ Import Namespace="System.IO" %>//This template demonstrates using the AddTextWriter method//to output the template results to multiple locations concurrently.<script runat="template">public override void Render(TextWriter writer){StreamWriter fileWriter1 = new StreamWriter(@"test1.txt", true);this.Response.AddTextWriter(fileWriter1); StreamWriter fileWriter2 = new StreamWriter(@"test2.txt", true);this.Response.AddTextWriter(fileWriter2); base.Render(writer); fileWriter1.Close();fileWriter2.Close();}</script>
注意调用基类的base.Render,否则你就不会输出到缺省的文件。