在使用代碼模板產生代碼時,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,否則你就不會輸出到缺省的文件。