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

基本語法-聲明和使用屬性

CodeSmith 的核心是模板,而使模板具有活力的就是屬性,通過定義屬性從而使代碼模板能夠根據(jù)配置生成所需的代碼。在使用代碼模板時首先也必須給模板定義的屬性定義值才能使用 CodeSmith 通過模板產(chǎn)生代碼。有些屬性具有缺省值,這些屬性可以不需要配置。 模板中的屬性通過 Property 指令來定義:

<%@ Property Name="ClassName" Type="String" Default="Class1" Category="Context"   Description="The name of the class to generate" Optional="true" %>

屬性參數(shù)的介紹:

  • Name:模版使用的參數(shù)的名稱。
  • Type:參數(shù)類型可以是任何 .NET 有效的數(shù)據(jù)類型,例如簡單的 String 類型或者是 CodeSmith 的 SchemaExplorer.DatabaseSchema 類型。注意,類型必須是基類庫的類型,例如用 String 或者Int32 代替 string 和 int。
  • Default:設(shè)置默認值。
  • Category:用來說明這個屬性在 CodeSmith Explorer 的屬性面板中顯示成什么類型,例如下拉選擇、直接輸入等。
  • Description:在屬性面板中對于這個屬性的描述。
  • Optional:設(shè)置這個屬性是否是必須的,設(shè)置為 True 表明這個參數(shù)值可有可無,設(shè)置為 False 則這個參數(shù)必須有值。
  • Editor:表明在屬性面板中輸入這個屬性的值時使用何種 GUI(圖形界面編輯器)編輯器。
  • EditorBase:編輯器使用的基本類型,如果沒有被說明,UITypeEditor 為默認編輯器。
  • Serializer 定義用于屬性的 IPropertySerializer 類型。
  • OnChanged 為屬性發(fā)生變化時定義事件處理代碼。
  • DeepLoad 只用在 SchemaExplorer 對象,當為 True,SchemaExplorer 一次性取得有關(guān)數(shù)據(jù)庫 Schema 的所有信息而避免多次查詢數(shù)據(jù)庫。

在配置屬性時,每個屬性根據(jù)其類型和 Editor 不同而使用不同的配置界面,對應(yīng)一些簡單的類型,比如 Int,String 可以直接編輯,而對于數(shù)據(jù)庫類型可以使用 Schema Explorer,CodeSmith 預(yù)先定義了一些屬性編輯器,此外也可以通過自定義為某些特殊的屬性類型定義新的屬性編輯器,這在后面再介紹。通常情況下無需自定義。

在某些情況下,如果所定義的屬性值為一個列表中的某個值,比如在 CodeSmith 自帶的模板 SortedList.cst 中定義了一個屬性用來為所生成的類設(shè)置可見性:

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

這可以通過定義一個枚舉類型來實現(xiàn):

<script runat="template">
Public Enum AccessibilityEnum
      [Public]
      [Protected]
      [Friend]
      [ProtectedFriend]
      [Private]
End Enum
</script>

然后為所定義的屬性的類型定義為這個枚舉類型:

<%@ Property Name="Accessibility" Type="AccessibilityEnum"
Category="Options" Description="The accessibility of the class to be generated." %>

由于屬性可以定義為可選(Optional),因此在模板中需要檢測某個的屬性是否配置過,比如下面定義了一個屬性為 Optional

<%@ Property Name="ClassNamespace" Type="System.String" Optional="True" 
Category="Context" 
Description="The namespace that the generated class will be a member of." %>

在模板中腳本需要檢測這個屬性是否有值可以通過下面代碼來實現(xiàn):

<% if (ClassNamespace != null && ClassNamespace.Length > 0)
{ %>namespace <%= ClassNamespace %>{<% }
%>

從上面也可以看出,在腳本中使用屬性直接使用屬性名字即可,無需加前綴(比如$之類的前綴)。