在使用代碼模板產(chǎn)生代碼時,CodeSmith 引擎背后使用了不少對象來幫助代碼的生成,其中常用的有
本篇介紹 CodeTemplate ,CodeTemplate 代表了由 CodeSmith 引擎處理的代碼模板對象,可以通過 CodeTemplate 對象直接和 CodeSmith 引擎交互,比如:
在前面的例子 CodeSmith 使用教程(2): 編寫第一個代碼模板,我們已經(jīng)使用 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>
在定義屬性的缺省值時,有時有些屬性的缺省值可能無法從 String 轉(zhuǎn)換,此時可以通過重載ParseDefaultValue 方法,這個方法會被 CodeSmith 引擎中處理每個屬性時調(diào)用,如果你重載了這個方法,可以按照你自己的邏輯來處理屬性的缺省值。
CodeTemplate 的 Render 方法是 CodeSmith 引擎生成最終輸出時調(diào)用的,可以通過重載這個方法來修改輸出的內(nèi)容或是把輸出寫到多個文件中。 比如下面代碼除了生成缺省的輸出外,還把輸出寫到另外兩個文件中:
<%@ 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>
注意調(diào)用基類的 base.Render,否則你就不會輸出到缺省的文件。本例下載
CodeTemplate 類定義了下面幾個事件,你可以中這些事件發(fā)生時添加自動的事件處理。
和 Asp.Net 的 Page 對象一樣,可以通過 CodeTemplate 的 Response 屬性直接在輸出流中寫入內(nèi)容。比如
<%@ CodeTemplate Language="C#" TargetLanguage="Text"
Description="This template demonstrates writing directly to the Response property" %>
<% RenderDirect(); %>
<script runat="template">
public void RenderDirect()
{
Response.WriteLine("Written directly to the Response property.");
Response.WriteLine("Hello " + System.Environment.UserName + "!");
}
</script>
直接在輸出流中寫入兩行文字。Response 對象的類型為 CodeTemplateWriter 類 ,常用的方法有:
更多建議: