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ù)的介紹:
在配置屬性時,每個屬性根據(jù)其類型和 Editor 不同而使用不同的配置界面,對應(yīng)一些簡單的類型,比如 Int,String 可以直接編輯,而對于數(shù)據(jù)庫類型可以使用 Schema Explorer,CodeSmith 預(yù)先定義了一些屬性編輯器,此外也可以通過自定義為某些特殊的屬性類型定義新的屬性編輯器,這在后面再介紹。通常情況下無需自定義。
在某些情況下,如果所定義的屬性值為一個列表中的某個值,比如在 CodeSmith 自帶的模板 SortedList.cst 中定義了一個屬性用來為所生成的類設(shè)置可見性:
這可以通過定義一個枚舉類型來實現(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 %>{<% }
%>
從上面也可以看出,在腳本中使用屬性直接使用屬性名字即可,無需加前綴(比如$之類的前綴)。
更多建議: