鍍金池/ 教程/ C++/ CodeTemplate 對(duì)象
使用主從代碼模板
CodeTemplateInfo 對(duì)象
引用其它文件或 .Net 類庫(kù)
編寫第一個(gè)代碼模板
Progress 對(duì)象
基本語(yǔ)法-使用注釋
基本語(yǔ)法-轉(zhuǎn)義Asp.Net標(biāo)記
調(diào)試
為 Yii Framework 創(chuàng)建生成 ActiveRecord 的代碼模板
基本語(yǔ)法-聲明和使用屬性
自動(dòng)生成Yii Framework ActiveRecord類簡(jiǎn)單模板
Merge 策略
使用 XMLProperty
CodeTemplate 對(duì)象
基本語(yǔ)法-CodeTemplate 指令
概述
使用 SchemaExplorer 來(lái)獲取數(shù)據(jù)庫(kù)定義

CodeTemplate 對(duì)象

在使用代碼模板產(chǎn)生代碼時(shí),CodeSmith 引擎背后使用了不少對(duì)象來(lái)幫助代碼的生成,其中常用的有

  • CodeTempate (類似于 Asp.Net 的 Page 類)
  • Progress 用于顯示代碼生成的進(jìn)度
  • CodeTemplateInfo 可以返回關(guān)于當(dāng)前模板自身的一些信息。

本篇介紹 CodeTemplate ,CodeTemplate 代表了由 CodeSmith 引擎處理的代碼模板對(duì)象,可以通過 CodeTemplate 對(duì)象直接和 CodeSmith 引擎交互,比如:

  • 使用 GetFileName 修改模板生成的缺省文件名
  • 使用 Render method 把模板的輸出到多個(gè)文件中
  • 通過 events 把代碼插入到 CodeSmith 引擎處理模板的過程中。
  • 通過 Response 屬性直接在輸出文件中寫內(nèi)容。

使用 GetFileName 修改模板輸出的文件名

在前面的例子 CodeSmith 使用教程(2): 編寫第一個(gè)代碼模板,我們已經(jīng)使用 GetFileName 修改過輸出的文件名,比如在你的模板中定義了一個(gè) 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 方法

在定義屬性的缺省值時(shí),有時(shí)有些屬性的缺省值可能無(wú)法從 String 轉(zhuǎn)換,此時(shí)可以通過重載ParseDefaultValue 方法,這個(gè)方法會(huì)被 CodeSmith 引擎中處理每個(gè)屬性時(shí)調(diào)用,如果你重載了這個(gè)方法,可以按照你自己的邏輯來(lái)處理屬性的缺省值。

重載 Render 方法

CodeTemplate 的 Render 方法是 CodeSmith 引擎生成最終輸出時(shí)調(diào)用的,可以通過重載這個(gè)方法來(lái)修改輸出的內(nèi)容或是把輸出寫到多個(gè)文件中。 比如下面代碼除了生成缺省的輸出外,還把輸出寫到另外兩個(gè)文件中:

<%@ 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>

http://wiki.jikexueyuan.com/project/codesmith/images/16.png" alt="第16張" />

注意調(diào)用基類的 base.Render,否則你就不會(huì)輸出到缺省的文件。本例下載

模板事件

CodeTemplate 類定義了下面幾個(gè)事件,你可以中這些事件發(fā)生時(shí)添加自動(dòng)的事件處理。

  • OnInit 事件幫助中代碼模板創(chuàng)建時(shí)
  • OnPreRender 事件發(fā)生在準(zhǔn)備寫輸出文件前
  • OnPostRender 事件發(fā)生在準(zhǔn)備寫輸出文件后
  • OnPropertyChanged 事件發(fā)生在屬性值發(fā)生變化時(shí).

使用 Response 對(duì)象

和 Asp.Net 的 Page 對(duì)象一樣,可以通過 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 對(duì)象的類型為 CodeTemplateWriter 類 ,常用的方法有:

  • AddTextWriter -添加額外的輸出位置
  • Indent – 為輸出添加一個(gè)縮進(jìn)
  • Unindent – 為輸出減少一個(gè)縮進(jìn)
  • Write -寫入內(nèi)容
  • WriteLine – 寫入內(nèi)容并添加分行符